百万レベルのデータクエリ、SQLクエリの最適化

1550 ワード

最近のプロジェクトで遭遇したビッグデータクエリーについてまとめます.
この文章は私に多くの時間を費やして、ネット上で資料を探して自分の総括とまとめて、もし適切でないならば、みんなに指摘してください:
1.ビッグデータ・クエリーでlikeファジイクエリーを避けるには、ファジイクエリーを行うときに複数回の全表遍歴を行い、クエリーの効率、速度に影響します.ファジイクエリを使用するには、前のファジイクエリ、すなわちパーセンテージ後のクエリを使用します.
2.or条件クエリーは避け、空でない場合はis not nullを使用できます(<>'or<>null)
3.降順の使用を避ける
4.where句での使用を避ける!=および<>オペレータを使用すると、エンジンがインデックスの使用を放棄し、テーブル全体を巡回します.
5.関連クエリーを行う場合、インデックスは関連条件に設定されるべきである(on)
6.groupbyの再利用
7.フィールド属性がnot nullに設定されている(クエリフィールドがnullの場合、インデックスが無効になる)
8.SQL内蔵関数の使用を避ける
9.合理的にインデックスを作成する(インデックスは空間を使って時間を変えて最適化する方式で、多すぎるインデックスを作成する時、新しいデータを追加して、データを修正する時(同時にインデックス列を修正した)、インデックスも同期的に更新して、効率に影響する)
10.クエリーの最適化
--   count(*)        ,         
EXPLAIN SELECT SQL_NO_CACHE count(*) FROM `log`


EXPLAIN SELECT SQL_NO_CACHE count(1) FROM `log`

--       null
EXPLAIN SELECT SQL_NO_CACHE count(id) FROM `log`


--            null       
EXPLAIN SELECT SQL_NO_CACHE count(param) FROM `log`


-- ====================================================================
--                   
EXPLAIN SELECT SQL_NO_CACHE id,group FROM `log` LIMIT 0,10

--      ,ttime                    
EXPLAIN SELECT SQL_NO_CACHE id,ttime FROM `log` LIMIT 0,10


--                  all     (       )
EXPLAIN SELECT SQL_NO_CACHE id,ttime,code FROM `log` LIMIT 500,10


--       10w     ,    ,      ,     
EXPLAIN SELECT SQL_NO_CACHE
    a.id,a.ttime,a.code
FROM  
    `log` a
INNER JOIN
    (SELECT id FROM `log` LIMIT 500,10 ) b
ON
    a.id = b.id

間違いがあれば、ご指摘ください.