在像查询这样的大型mysql上使用索引的最佳方法

时间:2013-09-26 01:51:22

标签: mysql ajax query-optimization sql-like

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

table t1中选择t1。*,其中1和t1。inactive ='0'和(t1。code喜欢'%searchtext%'或t1。{{1}像'%searchtext%'或t1。name喜欢'%searchtext%')按顺序排序。ext desc LIMIT 0,15

id是主要索引。

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

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

优化此类查询的最佳方法是什么?我想在不到1秒的时间内取得成绩,是否可行?

2 个答案:

答案 0 :(得分:0)

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

对于索引,您需要检查计划以查看您的索引是否实际被使用。全文索引可能有所帮助,但这取决于您返回的行数和传入的数量。使用%等参数可以消耗性能。如果索引以%结尾但不以%开头,您仍然可以使用索引。如果你在要搜索的文本的两边放置%,索引就无法帮助太多。

答案 1 :(得分:0)

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

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

如果省略ORDER BY子句,则默认使用MATCH函数结果相关性值对行进行排序。有关更多信息,请阅读Full-Text Search Functions documentation

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