MySQL社区

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

搜索
查看: 2700|回复: 2
打印 上一主题 下一主题

求救,orderby效率低下

[复制链接]
跳转到指定楼层
1#
发表于 2014-4-2 15:57:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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使用索引的方法。



分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享淘帖 顶 踩
2#
发表于 2014-4-2 18:06:38 | 只看该作者
主要是group by 慢吧
可以建立前缀索引,拿字段的前几个字符。
另外5.1以上varchar就可以到达65535了,可以考虑用varchar代替text

另外主要看SQL的执行计划...
3#
 楼主| 发表于 2014-4-2 21:00:19 | 只看该作者
问题自己找出来了,出在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).看看行不行。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|申请友链|小黑屋|Archiver|手机版|MySQL社区 ( 京ICP备07012489号   
联系人:周生; 联系电话:13911732319

GMT+8, 2024-6-28 07:38 , Processed in 0.065999 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表