我用一个表创建了一个mysql测试数据库来进行一些性能测试。此表有4列:id、name、email、company。
我在这张table上填了大约80万行,包括10家不同的公司。
具体结构如下:
数据库的结构
我已经创建了许多索引,我正在试图找出为什么下面的查询不使用多索引:
SELECT * FROM test WHERE name like 'jo%' order by email
我本以为时间很短,但仍然需要1秒左右。你知道吗?
第二个问题:这个请求 SELECT * FROM test WHERE company = 'GB' and name like 'jo%' order by email
所花的时间和前一次完全一样。这不是逻辑,因为只有10%的行有“gb”作为company,所以它的限制性要大得多,并且存在一个索引(company、name、email)。
任何解释都能帮助我更好地优化它。
谢谢!
2条答案
按热度按时间yjghlzjz1#
添加全文索引
ALTER TABLE test ADD FULLTEXT INDEX 'MyIndex'(name)
(这可能需要一段时间)。使用全文搜索(https://dev.mysql.com/doc/refman/5.5/en/fulltext-boolean.html). 你的情况是
SELECT * FROM test WHERE MATCH(name) AGAINST ('jo*')
您也可以在其他列上添加全文索引,但不要过度-索引太多也会影响性能q1qsirdb2#
需要“综合”索引:
INDEX(company, name)
--按这个顺序。因为“范围”(
LIKE 'jo%'
),索引无法帮助ORDER BY
. 所以,EXPLAIN
必须显示“文件排序”。别担心。(请提供屏幕截图
SHOW CREATE TABLE
,尤其是性能问题。)(the)
FULLTEXT
另一个答案中的建议不太可能比我对示例查询的答案快。在其他情况下可能更快。)