0

我在我的 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 秒。

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

4

1 回答 1

0

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

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

更改表 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 值。

于 2013-01-19T19:20:13.447 回答