TO trampwind(随风) wildlily980(小李) 表结构里的KEY NCODE_CODE_LB (NCODE, CODE, LB) 已经做了这三个字段的索引
你的or语句部分可能无法利用索引的,正表扫描就会非常慢,把语句改成: select LASTD,QNOTED,CX,DAT from wme where NCODE = '$code' and LB='$lb' union select LASTD,QNOTED,CX,DAT from wme where CODE = '$code' and LB='$lb'; 在NCODE, CODE, LB三个字段上各建独立的索引,返回记录不是特别多的话应该非常快的(如果多可以limit下)。
TO fanyi2003(才鸟) 你是怎样实现?能不能告诉我一下
我也看了这个资料,这个试过了,还是需要14秒,的确是比用 $query = "select LASTD,QNOTED,CX,DAT from wme where (NCODE = '$code' or CODE = '$code') and LB='$lb'"; 快了 几秒钟,我也测试过了
你是说按select LASTD,QNOTED,CX,DAT from wme where NCODE = '$code' and LB='$lb' union select LASTD,QNOTED,CX,DAT from wme where CODE = '$code' and LB='$lb'; 查询仍然会很慢,我说的在NCODE, CODE, LB三个字段上各建独立的索引不知道你建了没(不是你建表的时候那个联合索引,可以这样建(如果肯定某列唯一的话建unique index更好): create index index_wmencode on wme(NCODE); create index index_wmecode on wme(CODE); create index index_wmelb on wme(LB); ) [你原来建表的时候建的索引按这个语句也只能NCODE = '$code' 这一个条件可以利用上,其它的LB='$lb' 要在NCODE = '$code' 的结果集中扫描,union后面的要做全表扫描自然会慢。如果三个独立的索引你也都建了,仍然慢,那估计NCODE或CODE或LB它们单个的重复值特多(比入100W数据NCODE为某个值的就20W,30W,那索引意义就不大了)。 另外可以考虑and的两个条件换位置,比如你了解表中LB重复值很少,可以把NCODE = '$code' and LB='$lb'换成 LB='$lb' and NCODE = '$code',这样前面条件已经排除了绝大部分记录,而本身LB(要建独立索引的)有索引,定位记录是很快的。查询规划器估计不会自动做这个优化(当然一些简单的比较1=0的条件查询规划器会直接认为条件永假的),要自己把握。
我只是查询其中的一条
表结构里的KEY NCODE_CODE_LB (NCODE, CODE, LB) 已经做了这三个字段的索引
select LASTD,QNOTED,CX,DAT from wme where NCODE = '$code' and LB='$lb' union select LASTD,QNOTED,CX,DAT from wme where CODE = '$code' and LB='$lb';
在NCODE, CODE, LB三个字段上各建独立的索引,返回记录不是特别多的话应该非常快的(如果多可以limit下)。
$query = "select LASTD,QNOTED,CX,DAT from wme where (NCODE = '$code' or CODE = '$code') and LB='$lb'";
快了 几秒钟,我也测试过了
查询仍然会很慢,我说的在NCODE, CODE, LB三个字段上各建独立的索引不知道你建了没(不是你建表的时候那个联合索引,可以这样建(如果肯定某列唯一的话建unique index更好):
create index index_wmencode on wme(NCODE);
create index index_wmecode on wme(CODE);
create index index_wmelb on wme(LB);
)
[你原来建表的时候建的索引按这个语句也只能NCODE = '$code' 这一个条件可以利用上,其它的LB='$lb' 要在NCODE = '$code' 的结果集中扫描,union后面的要做全表扫描自然会慢。如果三个独立的索引你也都建了,仍然慢,那估计NCODE或CODE或LB它们单个的重复值特多(比入100W数据NCODE为某个值的就20W,30W,那索引意义就不大了)。
另外可以考虑and的两个条件换位置,比如你了解表中LB重复值很少,可以把NCODE = '$code' and LB='$lb'换成 LB='$lb' and NCODE = '$code',这样前面条件已经排除了绝大部分记录,而本身LB(要建独立索引的)有索引,定位记录是很快的。查询规划器估计不会自动做这个优化(当然一些简单的比较1=0的条件查询规划器会直接认为条件永假的),要自己把握。
我中午的时候就想结贴了(因为我回复了三次,所以不能答谢)谢谢你们,问题已经解决了,也是你们的说法
我的90w数据就是这样建的 查询起来很快
这几天没来 就得了一分 汗!