我有一个包含联系人记录的表,客户希望搜索此表以查找具有匹配电子邮件地址的记录(按帐户 ID 过滤)。结果由 RESTful API 分页。
这会导致运行如下查询:
SELECT * FROM CONTACT
WHERE deleted is null AND email like '%Matt%' AND accountid=1
ORDER BY lastname LIMIT 0,50;
在此表中,有 、 和 上email
的accountid
索引lastname
。总的来说,这个表有 360 万行,在这个特定的示例中,它accountid
有 170,000 行。此特定查询大约需要 2 分 30 秒才能完成。
如果我更改查询以删除ORDER BY
子句,查询将在大约 0.6 秒内完成。如果我更改查询以删除LIMIT
子句,查询将在大约 0.23 秒内完成。
我已经阅读了这篇文章,但我不确定我还能做些什么来改进这个查询。我知道email
由于完整的通配符搜索,不会使用索引,但我认为lastname
索引无论如何都会有所帮助ORDER BY
。
mysql> explain SELECT * FROM CONTACT WHERE deleted is null AND email like '%Matt%' AND accountid=1 ORDER BY lastname LIMIT 0,50;
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
| 1 | SIMPLE | a | index | accountid | lastname | 53 | NULL | 5804 | Using where |
+----+-------------+-------+-------+---------------+----------+---------+------+------+-------------+
1 row in set (0.00 sec)
如何改进此查询以使用ORDER BY
andLIMIT 0,50
子句更快地完成?
该综合指数可能会有所帮助:
添加它时,您也可以删除
INDEX(account_id)
它,因为它会是多余的。这可能会更好,但我不确定:
但是它不会取代
INDEX(account_id)
.