1 
                    
                    vindac      2020-06-02 18:38:06 +08:00 via Android 
                    
                    先查 id,再查全部? 
                 | 
            
     2 
                    
                    pushback      2020-06-02 18:43:12 +08:00 
                    
                    order by 不是也吃索引吗 
                 | 
            
     3 
                    
                    776491381      2020-06-02 18:43:33 +08:00 via iPhone 
                    
                    索引不只是要对 columnA 建立,如果要建,要把 timestamp 也建进去,否则优化的只是 1s 
                 | 
            
     4 
                    
                    rogwan      2020-06-02 18:44:51 +08:00 via iPhone 
                    
                    sql 执行不是想当然的先后顺序,order by 需要建个索引是常规操作。 
                 | 
            
     5 
                    
                    allen9527      2020-06-02 18:44:57 +08:00 
                    
                    为什么不想加索引?看执行计划,基本在扫描然后又内存排序。 子查询应该是一样的啊。。。 
                emm 。。。。 要不改改 sort_buffer_size 之类的参数大小  | 
            
     6 
                    
                    yjxjn      2020-06-02 18:45:42 +08:00 
                    
                    慎用子查询,join 不行吗?再就是 order by 不建立索引肯定速度慢呀。。 
                 | 
            
     7 
                    
                    eke      2020-06-02 18:47:12 +08:00 
                    
                    1. db 已经帮你做了 query optimization 吧? 
                 | 
            
     8 
                    
                    M7w2kh5a58AhKlcT      2020-06-02 19:02:14 +08:00    1. 为什么「先用子查询查出数据,再用 order by 排序子查询的数据」的方法行不通? 
                2. 这个查询除了对 columnA 建索引外,有没有其他更好的优化方法? 答: 1. 数据库做了逻辑优化,所以查询路径是一致的,当然你可以修改数据库统计信息,来欺骗数据库。如果数据库统计信息没有错误的话,数据库给你的执行计划就是相对最佳的执行计划。 2. A. 如果建索引要建的是 columnA 和 timestamp 的联合索引,而不是单列索引; B.更好的优化方法: 1) 改业务,不需要排序; 2 )换存储( RAID 、SSD 、傲腾等),增大内存; 3 )架构层面增加缓存系统,REDIS 、memcache 等; 4 )数据库缓存结果,或者使用物化视图; 5 )优化 SQL,增加联合索引; 供参考😀  | 
            
     10 
                    
                    snoy      2020-06-02 20:37:30 +08:00 
                    
                    用 select * from TableA  force index(columnA)  where TableA.columnA='value' order by timestamp;试试? 
                 | 
            
     11 
                    
                    jay0726      2020-06-02 23:14:05 +08:00 
                    
                    搜索关键字全字段排序和 rowid 排序了解一下就知道了,可以建立 columnA 和 timestamp 的联合索引,进一步优化还能建立覆盖索引减少回表 
                 | 
            
     12 
                    
                    xyjincan      2020-06-02 23:15:34 +08:00 
                    
                    查询取出 70w 数据好多啊,你看看分页,取前面的,跟取最后面的速度也是不一样的。 把结果查询保存到内存的临时表 
                 | 
            
     13 
                    
                    egfegdfr      2020-06-03 09:53:14 +08:00 
                    
                    1. 为什么「先用子查询查出数据,再用 order by 排序子查询的数据」的方法行不通? 
                2. 这个查询除了对 columnA 建索引外,有没有其他更好的优化方法? 答 1. ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序。 排序的对象是 where 后的数据,所以你用不用子查询,需要排序的数据都是 70w 。 所以在这里,这个方法是行不通的。 2. 不知道数据插入的时候有 主键是不是按时间戳顺序生成的。如果是那就好办了,直接 order by 主键就行。如果不是,好像除了改业务,或者是加硬件 也就是建立 timestamp 的索引这个方法比较实际了。  | 
            
     14 
                    
                    ljzxloaf      2020-06-03 10:38:20 +08:00 
                    
                    1. mysql 本来就是这么干的 
                2. 适当调大 sort-buffer,使每次排序的数据量大一些,减少 merge 排序的次数,从而减少 io ; 不过还是建议加个联合索引( columnA,timestamp ),这样就不用每次排序了  |