我有一個超過500萬行的表。當我執行選擇查詢時,大約需要20秒。MYSQL - 索引和優化選擇查詢
SELECT CompUID,Weburl FROM `CompanyTable` WHERE (Alias1='match1' AND Alias2='match2')OR Alias3='match3' OR Alias4='match4'
下面是表結構:
CREATE TABLE `CompanyMaster` (
`CompUID` int(11) NOT NULL AUTO_INCREMENT,
`Weburl` varchar(150) DEFAULT NULL,
`CompanyName` varchar(200) DEFAULT NULL,
`Alias1` varchar(150) DEFAULT NULL,
`Alias2` varchar(150) DEFAULT NULL,
`Alias3` varchar(150) DEFAULT NULL,
`Alias4` varchar(150) DEFAULT NULL,
`Created` datetime DEFAULT NULL,
`LastModified` datetime DEFAULT NULL,
PRIMARY KEY (`CompUID`),
KEY `Alias` (`Alias1`,`Alias2`,`Alias3`,`Alias4`)
) ENGINE=InnoDB AUTO_INCREMENT=5457968 DEFAULT CHARSET=latin1
下面是從查詢的解釋:
--------+------------------------------------------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+----------+-------+---------------+------+---------+------+---------+----------------------+
| 1 | SIMPLE | CompanyTable | ALL | Alias | NULL | NULL | NULL | 5255929 | Using where |
+----+-------------+----------+-------+---------------+------+---------+------+---------+----------------------+
我使用的複合索引Alias
(Alias1
,Alias2
,Alias3
,Alias4
) 。 但我相信這不是最好的。請爲此選擇查詢查找建議正確的索引。
的'或別名3 =「MATCH3」 OR Alias4 ='match4''是什麼迫使全表掃描。這個條款基本上是沒有索引的。爲了優化這個查詢,你需要在Alias3和Alias4上添加一個索引。 – drew010
您可以通過提供如下提示來檢查查詢的性能:'SELECT CompUID,Weburl FROM'CompanyTable' use index(Alias)...'。這在速度上有所不同嗎? – zedfoxus
以下查詢的共享計數:「從」CompanyTable「中選擇count(*),其中Alias1 ='match1'AND Alias2 ='match2';」和「從CompanyTable'中選擇count(*),其中Alias1 ='match3'」和「從CompanyTable'中選擇count(*),其中Alias1 ='match4」。 –