linux 在线db服务器 mysql从慢查询日志找到如下连续出现n行的
# Time: 100527  8:10:21
# User@Host: [] @ m [192.168.10.1]
# Query_time: 2  Lock_time: 0  Rows_sent: 49812  Rows_examined: 149436
select distinct id from Out where isHistory='N' order by id;
# Time: 100527  8:10:33
# User@Host: [] @ n[192.168.10.2]
# Query_time: 2  Lock_time: 0  Rows_sent: 49824  Rows_examined: 149472
select distinct id from Out where isHistory='N' order by id;
-----------------现在准备对这个sql进行优化 select distinct id from Out where isHistory='N' order by id;已经建立索引 发现实际不理想,这个sql返回5万条数据。
当前架构如下:  (Out 所在地db服务器是 生产机器product机器(数据库主服务器),  2台web服务器(java)也带有仅仅带缓存数据的 mysql db,就是上面的([192.168.10.1] [192.168.10.2]) )这样上面的sql是 [192.168.10.1]发给 生产机器product机器,在生产机器product机器上执行完后返回5万数据给 [192.168.10.1]。现在要对[192.168.10.1]上面的java代码里的那个sqlselect distinct id from Out where isHistory='N' order by id;
进行优化 , 这个数据返回是中度。(最大一个表select distinct id from OutMax where isHistory='N' order by id;返回22万 )申明一点:返回到[192.168.10.1]的5万数据不会再jsp里显示,仅仅在内存里使用完就释放掉当前有2个不清楚
1  这个可以优化吗?  (他不在jsp里显示,不好用limit 划分语句或页面。)
2  # Time: 100527  8:10:21
   # Time: 100527  8:10:33
甚至没几秒这个语句就执行一次。  他是高密度执行的sql (估计多个线程执行)。有什么方法可以 进行优化 ??? 

解决方案 »

  1.   

    isHistory='N' order by id;不是 , 仅仅 (id), 以前看过一些文章 
    说高并发环境不是适合复合索引 。   (这里id就是主键,每个id都不同的 
    按道理没有必要再建立 符合索引
      

  2.   

    返回5万条记录给程序的目的是什么?????第二,id是不是主键?如果是,就没必要distinct了
      

  3.   

    添加 (isHistory,id) 的索引
      

  4.   

    换了个12g内存的机器 ,out表数据是以前5倍, 但是执行时间是0.2s 
    在线db是 2s (这个是最快的)
    硬件问题是王道
    另外我建立复合索引 ,用强制索引。 速度比以前要快。  但用工具执行的时候总是有个停顿之后出数据,没有加强制索引的没有停顿   (这个停顿就是强制索引引起 是否在编译sql)
      

  5.   

    现在java里已经准备限制5万以内,目前该表20万不到 , 
    percent是 30%左右。 问这个强制索引有必要否
      

  6.   

    找了个小表 15万左右 未加索引 是 0.2s 加了索引是 0.02s 但是数据一多(比如40万的out表), 索引反倒大大拖累查询 。  到底什么原因 ----??
      

  7.   

    尽信书还不如无书
    mysql的书不太多 , 反复测试总结 解决问题是最主要的。
    前面做的就是按书上来的