【问题标题】:MySQL-Query too slowMySQL-Query 太慢
【发布时间】:2013-01-19 18:30:52
【问题描述】:

我在我的 MySQL 数据库中使用以下表格:

--
-- Table structure for table `company`
--

CREATE TABLE IF NOT EXISTS `company` (
  `numb` varchar(4) NOT NULL,
  `cik` varchar(30) NOT NULL,
  `sNumber` varchar(30) NOT NULL,
  `street1` varchar(255) NOT NULL,
  `street2` varchar(255) NOT NULL,
  `city` varchar(255) NOT NULL,
  `state` varchar(100) NOT NULL,
  `zip` varchar(100) NOT NULL,
  `phone` varchar(255) NOT NULL,
  `name` varchar(255) NOT NULL,
  `dateChanged` varchar(30) NOT NULL,
  `name2` varchar(255) NOT NULL,
  `seriesId` varchar(30) NOT NULL,
  `symbol` varchar(10) NOT NULL,
  `exchange` varchar(20) NOT NULL,
  PRIMARY KEY (`cik`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;


INSERT INTO `company` (`numb`, `cik`, `sNumber`, `street1`, `street2`, `city`, `state`, `zip`, `phone`, `name`, `dateChanged`, `name2`, `seriesId`, `symbol`, `exchange`) VALUES
('6798', 'abc', '953551121', '701 AVENUE', '', 'GLENDALE', 'CA', '91201-2349', '818-244-8080', '', '', 'Public Store', '', 'PSA', 'NYSE')


--
-- Table structure for table `data`
--

CREATE TABLE IF NOT EXISTS `data` (
  `id` int(100) NOT NULL AUTO_INCREMENT,
  `number` varchar(100) NOT NULL,
  `elementname` mediumtext NOT NULL,
  `date` varchar(100) NOT NULL,
  `elementvalue` longtext NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=18439;

INSERT INTO `data` (`id`, `number`, `elementname`, `date`, `elementvalue`) VALUES
(1, '0001393311-10-000004', 'StockholdersEquityIncludingPortionAttributableToNoncontrollingInterest', '2009-12-31', '3399777000')


--
-- Table structure for table `filing`
--

CREATE TABLE IF NOT EXISTS `filing` (
  `number` varchar(100) NOT NULL,
  `file_number` varchar(100) NOT NULL,
  `type` varchar(100) NOT NULL,
  `amendment` tinyint(1) NOT NULL,
  `date` varchar(100) NOT NULL,
  `cik` varchar(30) NOT NULL,
  PRIMARY KEY (`accession_number`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `filing` (`number`, `file_number`, `type`, `amendment`, `date`, `cik`) VALUES
('0001393311-10-000004', '001-33519', '10-K', 0, '2009-12-31', '0000751653'),
('0000751652-10-000006', '001-08796', '10-K', 0, '2009-12-31', '0000751652')

数据表有大约 22.000 个条目,归档和公司表各有大约 400 个条目。以后想用更多的条目来操作数据库。

我执行以下查询,它选择具有给定类型的最新项目:

SELECT data.elementname, data.elementvalue, company.name2 FROM data
JOIN filing ON data.number = filing.number
JOIN company ON filing.cik = company.cik
WHERE elementname IN ('Elem1', 'Elem2', 'Elem3', 'Elem4', 'Elem5', 'ElemN')

 AND number IN (
  SELECT number
   FROM filing
   WHERE filing.cik IN ('cik1', 'cik2', 'cikN')
   AND filing.type = '1L'
   GROUP BY filing.cik
)

大约需要 0.28 到 0.4 秒才能完成,这似乎很慢。

当我在没有以下行的情况下执行查询时

WHERE filing.cik IN ('cik1', 'cik2', 'cikN')

只需要 ~0.035 秒。

知道如何加快查询速度或优化表结构,因为表正在快速增长并且已经太慢了。

【问题讨论】:

  • 使用索引。你没有。
  • 你能为我的数据库推荐一个索引吗?我对使用它们不是很有经验。谢谢。

标签: mysql performance optimization select


【解决方案1】:

首先,您为filing 发布的表结构不正确,因为您指定的主键不正确。我假设你的意思是number。此外,您没有为 company 指定表定义,这使得尝试为此提供建议有些困难。

但是,两个 cmets 都是正确的。你需要一些索引。根据查询,您可能应该有以下一些索引。

ALTER TABLE company 添加索引 (cik)
更改表data 添加索引(number

我还建议看一下 data.elementname 是否真的需要是一个 MEDIUMTEXT,这是一个非常大的列。如果其余数据看起来像您提供的示例数据,您可能应该将其更改为 varchar。由于 TEXT 列的存储方式,它们可能会导致严重的性能损失。

此外,您的 PRIMARY KEY 数字列(当前是字符串)看起来好像可以重新格式化为实际上是 INT 类型的不同列。请记住,VARCHAR PRIMARY KEY 列的效率不如 INT,因为它们要大得多。

最后,22k 行并不是那么多数据。你应该看看你的 my.cnf 设置。您的 key_buffer 值可能太小而无法完全适应内存中的索引。此外,您可能需要考虑对这些表使用 INNODB,并结合将所有内容保存在内存中的 innodb_buffer_pool 值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-05
    • 2014-01-27
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2013-08-29
    • 2020-05-28
    • 1970-01-01
    相关资源
    最近更新 更多