【发布时间】:2016-06-14 20:14:31
【问题描述】:
我有一个超过 500 万行的表。当我执行选择查询时,大约需要 20 秒。
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)。
但我相信这不是最好的。请为此选择查询查找建议我正确的索引。
【问题讨论】:
-
OR Alias3='match3' OR Alias4='match4'是强制进行全表扫描的原因。该子句基本上没有索引。为了优化此查询,您需要在 Alias3 和 Alias4 上添加索引。 -
您可以通过提供如下提示来检查查询的性能:
SELECT CompUID,Weburl FROMCompanyTable` use index(Alias) ...`。这会影响速度吗? -
以下查询的共享计数:“select count() from
CompanyTablewhere Alias1='match1' AND Alias2='match2';”和 "select count() fromCompanyTablewhere Alias1='match3'" 和 "select count(*) fromCompanyTablewhere Alias1='match4"。