mysql where条件中用到大于或者小于时,查询未用到索引的问题

昆泽 2013-08-06 04:11:00

CREATE TABLE IF NOT EXISTS `index` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`pp` varchar(64) COLLATE utf8_unicode_ci NOT NULL,
`fid` smallint(6) NOT NULL,
`time` int(12) NOT NULL,
`threadid-floor` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `index` (`pp`,`fid`,`time`),
KEY `pp` (`pp`),
KEY `time` (`time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='用户搜索' AUTO_INCREMENT=62878612 ;


explain select `threadid-floor` from `index` force index(`time`) where `time`>1370304000
如下:

表总行数6万千左右,rows将近3千万,如果不用force index根本不会用到索引。

问题:已经有个time索引,查询的where中也只有time,本应该是先从索引中查找出需要的行的primary id,然后从primary里取到需要的数据,不应该遍历这么多行。

...全文
11994 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ACMAIN_CHM 2013-08-06
  • 打赏
  • 举报
回复
贴出 show index from `index`
rucypli 2013-08-06
  • 打赏
  • 举报
回复
走全表扫描会更快的
yumenfeiyu945 2013-08-06
  • 打赏
  • 举报
回复
引用 2 楼 lzcwxc1986 的回复:
[quote=引用 1 楼 yumenfeiyu945 的回复:] 6千万中查3千万,走索引只会更慢,所以直接全秒扫描了
并不是六千万中查三千万,真正匹配的数据也就几十万而已。[/quote] 还有其他where条件?不然rows有3千万需要的怎么才几十万。不管怎样,time索引只能从6千万中区分出3千万,所以优化器没有选择使用索引
昆泽 2013-08-06
  • 打赏
  • 举报
回复
引用 1 楼 yumenfeiyu945 的回复:
6千万中查3千万,走索引只会更慢,所以直接全秒扫描了
并不是六千万中查三千万,真正匹配的数据也就几十万而已。
yumenfeiyu945 2013-08-06
  • 打赏
  • 举报
回复
6千万中查3千万,走索引只会更慢,所以直接全秒扫描了

56,912

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧