0

这个 mysql 查询在一个大的(大约 200 000 条记录,41 列)myisam 表上运行:

从 t1 中选择 t1.*,table其中 1 和 t1。inactive= '0' and (t1. codelike '%searchtext%' or t1. namelike '%searchtext%' or t1. extlike '%searchtext%' ) 按 t1 排序。id描述限制 0, 15

id 是主索引。

我尝试在所有 3 个搜索(类似)列上添加多列索引。工作正常,但结果是在网站上的自动填充 ajax 表上提供的,第二次返回延迟有点太慢了。

我还尝试在所有 3 列上添加单独的索引,在所有 3 列上添加全文索引,但没有显着改进。

优化此类查询的最佳方法是什么?我想达到 1 秒以下的性能,可行吗?

4

2 回答 2

0

您可以创建涵盖以下三列的全文索引:codenameextMATCH() AGAINST ()然后使用函数执行全文查询:

select t1.*
from table t1
where match(code, name, ext) against ('searchtext')
order by t1.id desc
limit 0, 15

如果省略该ORDER BY子句,则默认使用MATCH函数结果相关性值对行进行排序。有关详细信息,请阅读全文搜索功能文档

LIKE正如@Vulcronos 所指出的,当运算符与以通配符开头的表达式一起使用时,查询优化器无法使用索引%

于 2013-09-26T02:18:49.403 回答
0

您可以做的最好的事情是实现分页。无论您做什么,IO 成本都将是巨大的。如果您只返回一页记录,10/25/ 或任何将有很大帮助的东西。

至于索引,你需要检查计划,看看你的索引是否真的被使用了。全文索引可能会有所帮助,但这取决于您返回的行数和传入的内容。使用诸如 % 之类的参数确实会降低性能。如果索引以 % 结尾但不以 % 开头,您仍然可以使用索引。如果将 % 放在要搜索的文本的两侧,索引将无济于事。

于 2013-09-26T02:02:34.290 回答