私たちのチームは先週、多くの mysql ロック タイムアウトと多くの非常に長時間実行されるクエリの原因をデバッグして見つけようとしました。結局、このクエリが犯人のようです。
mysql> explain
SELECT categories.name AS cat_name,
COUNT(distinct items.id) AS category_count
FROM `items`
INNER JOIN `categories` ON `categories`.`id` = `items`.`category_id`
WHERE `items`.`state` IN ('listed', 'reserved')
AND (items.category_id IS NOT NULL)
GROUP BY categories.name
ORDER BY category_count DESC
LIMIT 10\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: items
type: range
possible_keys: index_items_on_category_id,index_items_on_state
key: index_items_on_category_id
key_len: 5
ref: NULL
rows: 119371
Extra: Using where; Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: SIMPLE
table: categories
type: eq_ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 4
ref: production_db.items.category_id
rows: 1
Extra:
2 rows in set (0.00 sec)
厄介なテーブルスキャンを実行し、実行する一時テーブルを作成していることがわかります。
このクエリにより、データベースの応答時間が 10 倍になり、通常は 40 ~ 50 ミリ秒かかる一部のクエリ (項目テーブルの更新) が、50,000 ミリ秒以上になることがあるのはなぜですか?