我有一张超过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上添加索引。 - drew010SELECT CompUID,Weburl FROM
CompanyTableuse index(Alias)
。这会对速度产生影响吗? - zedfoxusCompanyTable
where Alias1='match1' AND Alias2='match2';" 和 "select count() fromCompanyTable
where Alias1='match3'" 和 "select count(*) fromCompanyTable
where Alias1='match4". - Zafar Malik