Nhóm của chúng tôi vừa mới gỡ lỗi tuần trước và cố gắng tìm nguồn gốc của nhiều thời gian chờ khóa mysql và nhiều truy vấn chạy rất dài. Cuối cùng, có vẻ như truy vấn này là thủ phạm.Tại sao truy vấn này gây ra thời gian chờ chờ khóa?
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)
Tôi có thể thấy rằng nó đang thực hiện quét bảng khó chịu và tạo bảng tạm thời để chạy.
Tại sao truy vấn này làm cho thời gian phản hồi của cơ sở dữ liệu tăng lên 10 lần và một số truy vấn thường mất 40-50ms (cập nhật trên bảng mục), phát nổ đến 50.000 mili giây và cao hơn?
Bạn đã thử định dạng * mà không có * 'khác biệt'? Phải mất khá nhiều công việc để làm như vậy và bạn có khá nhiều hàng để lọc quá :) – PhD
Rất đẹp. Nope không làm thế. Nó chắc chắn giúp tối ưu hóa nó. Vẫn chưa rõ lý do tại sao một truy vấn chậm như thế này có thể gây ra nhiều vấn đề cho chúng tôi. – chrishomer
Chỉ cần tự hỏi tại sao bạn cần điều này 'AND (items.category_id IS NOT NULL)' - vì nó là 'INNER JOIN' - là category.id được cho phép là' NULL' –