我有一张表为 trade ,其中里面有2个字段进行索引 trade_cate varchar(20), posttime INI(11)
在Mysql 4.0中我执行
select * from trade where trade_cate like '001%' order by posttime
通过Explain是使用正常的
possible_keys 为 trade_cate
key 为 trade_cate
Extra 为 Using where; Using filesort 但是我升级成Mysql 5.0和5.1发现 执行效率比原来低了几十倍,经过Explain发现,Mysql 5.x竟然用错了索引
possible_keys 为 trade_cate
key 为 posttime
Extra 为 Using where但是我的SQL语句如果写成 select * from trade where trade_cate = '001' order by posttime ,索引使用正常的是不是MySQL 5.x的查询分析器对like处理有问题,我估计MySQL 4.1也有类似问题?
无奈我只能在Mysql 5.x里使用USE INDEX (trade_cate) 强制使用trade_cate索引,但是要修改很多相关的程序,工作量就大了,不知道各位有没有碰到类似问题
在Mysql 4.0中我执行
select * from trade where trade_cate like '001%' order by posttime
通过Explain是使用正常的
possible_keys 为 trade_cate
key 为 trade_cate
Extra 为 Using where; Using filesort 但是我升级成Mysql 5.0和5.1发现 执行效率比原来低了几十倍,经过Explain发现,Mysql 5.x竟然用错了索引
possible_keys 为 trade_cate
key 为 posttime
Extra 为 Using where但是我的SQL语句如果写成 select * from trade where trade_cate = '001' order by posttime ,索引使用正常的是不是MySQL 5.x的查询分析器对like处理有问题,我估计MySQL 4.1也有类似问题?
无奈我只能在Mysql 5.x里使用USE INDEX (trade_cate) 强制使用trade_cate索引,但是要修改很多相关的程序,工作量就大了,不知道各位有没有碰到类似问题
解决方案 »
- 求助《[推荐] 各种乱码问题汇总》中没有的乱码问题
- 怎样将一个表的integer类型字段改成serial类型?
- Parameter index out of range (1 > number of parameters, which is 0).
- 关于update 分布中的数据,
- 如何改变mysql的server version?
- 我的插入语句文本比较大,用phpmyadmin里的sql执行时,一会儿就失败了,怎么办?
- mysql影响行数是什么意思?
- 对数据求和,并且列出所有数据
- MySql用函数或过程实现:AB 两个字母 排列组合 A,AB,B; ABC 三个字母 排列组合 A,B,C,AB,BC,AC,ABC
- mysql 服务无法启动
- VFP的DBC數據庫如何導入到MYSQL
- 请帮忙:Postgis文档中,java client部分代码,修改了下无法在jsp+tomcat6.0+jdk1.5的环境下编译通过
001 记录1
001 记录2
001 记录3
001 记录4
002 记录5
如果是用trade_cate作索引,可能有一个集合需要去选择,而posttime据我猜测应该是精确到秒,因此可能出现time('2009-01-01 18:00:01') 记录1
time('2009-01-01 18:00:02') 记录2显然如果用posttime可能更合适点,只要一次就能找到对应的记录
不知道理解对不对?
因为mysql在对比2个索引,确认该使用哪个索引的时候, 优先考虑的是哪个最快,或更有效
假如trade_cate中含有001的记录 在整个表中比例很大,用posttime索引更快
反之用trade_cate索引.所以在mysql中应该还存储一些类似如键值分布图的数据,来进行以上的优先度计算。如果这些数值失效的情况,可能会引起优化判断失误。所以尝试优化一下表
or drop index ,create index 。try again