百万レベルのデータクエリ、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.クエリーの最適化
間違いがあれば、ご指摘ください.
この文章は私に多くの時間を費やして、ネット上で資料を探して自分の総括とまとめて、もし適切でないならば、みんなに指摘してください:
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
間違いがあれば、ご指摘ください.