具有LIKE和订购功能的Mysql索引

时间:2018-11-04 20:59:36

标签: mysql indexing query-optimization

我用一个表创建了一个mySql测试数据库,以进行一些性能测试。 该表有4列:ID,名称,电子邮件,公司。

我在这张表中填充了约80万行,其中包括10家不同的公司。

以下是结构的详细信息:

The structure of the DB

我创建了许多索引,我试图弄清楚为什么以下查询不使用多重索引:

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'作为公司,所以它的限制要多得多,并且存在索引(公司,名称,电子邮件)。

任何解释都可以帮助我更好地对其进行优化。

谢谢!

2 个答案:

答案 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可能不会比我在示例查询中的答案。在其他情况下可能会更快。)