数据库只有一张表,大概有5000万以上的数据,我的查询中要频繁使用其中两个double的字段double_field1,double_field2,查询类似于:select count(*) from table_name where double_field1>=12.3 and double_field1<13.2 and double_field2>=20.3 and double_field2<25为了提高查询速度,我将两个字段建立了一个联合索引,用explain命令查看上述查询,发现使用了这个索引,但执行这个查询的时候,MySQL进程占用CPU一直是0%,用show processlist查看查询线程的状态,发现其一直处于sending data的状态。我将同样的操作过程应用于一个小一点的表(大概10万行数据),没有任何问题,查询都挺正常。
是数据库太大导致的,还是我的索引设置有问题?求助大侠帮忙,现在项目催得特别紧,我必须在今天明天搞定这个事,不然前途堪忧啊!!!!感谢!

解决方案 »

  1.   

    索引是如何建的? (double_field1,double_field2) 如果这样的索引,则没有什么问题了。建义贴出你的explain select ...的结果以方便大家一起分析。
    数据量过多,或者符合 double_field1>=12.3  and double_field1 <13.2 的记录过多的话,会导速度比较慢。
      

  2.   

    谢谢回复!我刚又分别针对两个字段建了两个索引,结果是一样的,执行查询过后没什么反应,一直处于sending data状态。下面是explain的结果:explain select count(*) from st200906161500abismdt where latitude>=23.397158 and longitude>=116.739316 and latitude<=23.398056 and longitude<=116.7402951 SIMPLE st200906161500abismdt range indexLng,indexLat indexLng 8 \N 38055 Using where其中indexLng, indexLat为两个字段的索引
      

  3.   

    提示使用了其中一个索引indexLng,但不知数据库怎么操作的,执行查询过后CPU占用率为0%,过后一直处于sending data状态
      

  4.   

    我将这两个double类型的索引全部删除了,然后建了另外一个bitint类型的字段索引,结果这个索引工作得非常好难道是double类型索引的问题?
      

  5.   

    假如2种情况的数据量一样的情况下,而执行计划也显示索引都用上了,那就有点奇怪了,double与bigint都是8个字节,在存储上应该所占的空间一样,而你上面的查询条件走的是 “范围”查询,都是对索引进行全扫描,那IO量应该是一致的,所以,我也觉得奇怪了,期待你进一步提供更多相关信息。
      

  6.   

    其中indexLng, indexLat为两个字段的索引我的意思是建立这两个字段的复合索引,不是建两个索引,是建一个。create index idx_st200906161500abismdt_f1_f2 on st200906161500abismdt (latitude,longitude);