我用一个表创建了一个mySql测试数据库,以进行一些性能测试。 该表有4列:ID,名称,电子邮件,公司。
我在这张表中填充了约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'作为公司,所以它的限制要多得多,并且存在索引(公司,名称,电子邮件)。
任何解释都可以帮助我更好地对其进行优化。
谢谢!
答案 0 :(得分:0)
添加全文索引
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*')
您还可以在其他列上添加全文索引,但不要过度使用-太多索引也会影响性能
答案 1 :(得分:0)
int x
需要一个“复合”索引:WHERE company = 'GB' and name like 'jo%'
-按此顺序。
由于“范围”(INDEX(company, name)
),索引无法帮助LIKE 'jo%'
。因此,ORDER BY
将必然显示“文件排序”。不用担心。
(特别是对于性能问题,请提供EXPLAIN
而不是屏幕截图。)
(在另一个答案中建议的SHOW CREATE TABLE
可能不会比我在示例查询中的答案快。在其他情况下可能会更快。)