2013-01-19 253 views
0

我使用下面的表格中我的MySQL數據庫:的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秒執行查詢。

任何想法如何加快查詢或優化表結構,因爲表正在快速增長,它已經太慢了。

+3

使用索引。你沒有。 –

+1

** [使用Index,Luke!](http://use-the-index-luke.com/)** –

+0

您能爲我的數據庫建議一個索引嗎?我在使用它們方面並不是很有經驗。謝謝。 –

回答

0

首先,您發佈的filing的表結構不正確,因爲您指定的主鍵沒有。我假設你的意思是number。此外,您沒有指定company的表定義,這使得嘗試爲此提供建議有點困難。

但是,這兩個評論都是正確的。你需要一些索引。根據查詢,你可能應該有以下幾個索引。

ALTER TABLE company ADD INDEX(cik
ALTER TABLE data ADD INDEX(number

我也建議考慮看看是否data.elementname實際上需要一個MEDIUMTEXT,這是一個非常巨大的專欄。如果其餘數據看起來像您提供的示例數據,則應該將其更改爲varchar。由於存儲方式不同,TEXT列可能會導致一些嚴重的性能損失。

此外,您的PRIMARY KEY編號列(當前是字符串)看起來好像它們可能被重新格式化爲實際爲INT類型的不同列。請記住,VARCHAR PRIMARY KEY列不會像INT那樣高效,僅僅因爲它們更大。

最後,22k行並不是那麼多的數據。你應該看看你的my.cnf設置。您的key_buffer值可能太小,無法將索引完全放入內存中。此外,您可能需要考慮對這些表使用INNODB,並將innodb_buffer_pool值與內存中的所有內容保持一致。