MySQL社区

标题: 求救,orderby效率低下 [打印本页]

作者: simerjoe    时间: 2014-4-2 15:57
标题: 求救,orderby效率低下
本帖最后由 simerjoe 于 2014-4-2 16:05 编辑

表是这样的,数据不到10万条。
id(int) text1(varchar) text2(text) date(date)
现在要搜索text1和text2里面的内容,然后根据date排序。最后返回id。
text1和text2已做fulltext索引。
查询语句是这样写的
select SQL_CALC_FOUND_ROWS id from table
where 1=1 AND
MATCH(text1,text2) AGAINST ('xxx' IN BOOLEAN MODE)
group by id
order by date DESC  LIMIT 0, 15;

查看执行效率,复制表临时表占到用时的99.99%,也就是说orderby没有使用索引。
试图创建一个date+text1+text2+id的联合索引,由于text1没有固定长度,无法添加(text1不能改动)。
同时,由于date的类型原因,date也不能联合到fulltext索引里面去。

求一个可以让orderby使用索引的方法。




作者: kider    时间: 2014-4-2 18:06
主要是group by 慢吧
可以建立前缀索引,拿字段的前几个字符。
另外5.1以上varchar就可以到达65535了,可以考虑用varchar代替text

另外主要看SQL的执行计划...
作者: simerjoe    时间: 2014-4-2 21:00
问题自己找出来了,出在SQL_CALC_FOUND_ROWS 上。使用SQL_CALC_FOUND_ROWS 的时候没有使用索引。
现在的索引状态时id index索引,date index索引,text1,text2,fulltext索引。
现在关键是要搞个覆盖索引把id包含进去,要人为创建一个where语句。
我正在试where date>‘2000-01-01’ 然后建立一个index(date,id).看看行不行。




欢迎光临 MySQL社区 (http://mysqlpub.com/) Powered by Discuz! X3.2