我有一张表为 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索引,但是要修改很多相关的程序,工作量就大了,不知道各位有没有碰到类似问题
解决方案 »
- 如何在一个嵌套表中查询出记录的循环上级中是否有指定值? 谢谢
- 如何调用function函数
- 求SQL语句
- 在线等,mysql的isam表频繁损坏
- mysql是真的免费吗?有好多网站、虚拟主机、排名前几位的OA软件都集成或使用了mysql
- 这个统计语句要如何写?
- MySQL ODBC 3.15 driver安装了,odbc中找不到。
- ++++++++请问一个sql查询语句?
- 请问怎样在 mysql -u root -p 命令行直接写password,而不要等提示输入密码再输入
- 遍历数据库中所有的表
- 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