クエリが遅い原因と解決策
冗長データをスキャンし、使用を避ける select * from xxx
クロス 多表扫描
データを 减少join
適切に非正規化して、冗長データを増やし、スペースと時間を交換することができます。
索引没有建立
、インデックスが適切に最適化されていないか、最適なインデックスに適用されていません (結合インデックスは左端の一致を使用します)。
CREATE TABLE `test_table`
`id` bigint(20) UNSINGED NOT NULL AUTO_INCREMENT,
`name` varchar(32) DEFAULT NULL,
`age` int(16) DEFAULT NULL,
KEY `idx_age`(`age`)
)ENGINE = InnoDB CHARSET = utf8mb4;
作成されたインデックスが不適切です:
インデックスのデータ型はシンプルかつ適切で、占有スペースが少なく、NULL 値 (NOT NULL) をできるだけ避けることで、パフォーマンスが向上します。
数値型を比較する必要があるのは 1 回のみで、文字列は逐語的に比較されます。インデックスの数が 6 を超えないようにしてください。パフォーマンスの低下につながります。
性別など、繰り返しデータが多く含まれるフィールドはインデックス作成には適していません。ランダムな文字列はクラスター化インデックス (データ移動) の構築には適していません。
ユニオンインデックスは左端の一致を使用します
インデックスの失敗: or の使用を避けてください (代わりに Union all を使用してください)、in または not in (代わりに存在しますを使用してください)、null 変数であるか、一致するクエリまたは演算子であるか、または where 句内のフィールドに対して式および関数の操作を実行してください。そうでない場合は、次のエラーが発生 %abc%
し !=
ます <>
。エンジンはインデックスの使用を放棄し、テーブル全体のスキャンを実行します。
キャッシュ:
キャッシュの無効化: SQL の大文字と小文字の区別、 query_cache_size
サイズ超過、メモリ不足、キャッシュ タイムアウト、データ変更
-- 不会使用同一缓存
select name from users where id = 1;
SELECT name FROM users WHERE id = 1;
参考文献
MySQLの遅いクエリの問題を解決する