Mysql DB của tôi đã trở thành CPU đói cố gắng thực hiện truy vấn đặc biệt chậm. Khi tôi làm một giải thích, mysql nói "Sử dụng ở đâu; Sử dụng tạm thời; Sử dụng filesort". Hãy giúp giải mã và giải câu đố này.Cần trợ giúp điều chỉnh truy vấn sql
Bảng cấu trúc:
CREATE TABLE `topsources` (
`USER_ID` varchar(255) NOT NULL,
`UPDATED_TIME` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`URL_ID` int(11) NOT NULL,
`SOURCE_SLUG` varchar(100) NOT NULL,
`FEED_PAGE_URL` varchar(255) NOT NULL,
`CATEGORY_SLUG` varchar(100) NOT NULL,
`REFERRER` varchar(2048) DEFAULT NULL,
PRIMARY KEY (`USER_ID`,`URL_ID`),
KEY `USER_ID` (`USER_ID`),
KEY `FEED_PAGE_URL` (`FEED_PAGE_URL`),
KEY `SOURCE_SLUG` (`SOURCE_SLUG`),
KEY `CATEGORY_SLUG` (`CATEGORY_SLUG`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Bảng này có 370K hàng ... đôi khi cao hơn. Truy vấn dưới đây mất hơn 10 giây.
SELECT topsources.SOURCE_SLUG, COUNT(topsources.SOURCE_SLUG) AS VIEW_COUNT
FROM topsources
WHERE CATEGORY_SLUG = '/newssource'
GROUP BY topsources.SOURCE_SLUG
HAVING MAX(CASE WHEN topsources.USER_ID = 'xxxx' THEN 1 ELSE 0 END) = 0
ORDER BY VIEW_COUNT DESC;
Dưới đây là các mở rộng giải thích:
+----+-------------+------------+------+---------------+---------------+---------+-------+--------+----------+----------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------+---------------+---------------+---------+-------+--------+----------+----------------------------------------------+
| 1 | SIMPLE | topsources | ref | CATEGORY_SLUG | CATEGORY_SLUG | 302 | const | 160790 | 100.00 | Using where; Using temporary; Using filesort |
+----+-------------+------------+------+---------------+----
----------- + --------- + ------- + - ------- + ---------- + ------------------------------- --------------- +
Có cách nào để cải thiện truy vấn này không? Ngoài ra, có bất kỳ cài đặt mysql nào có thể giúp giảm tải CPU không? Tôi có thể phân bổ thêm bộ nhớ có sẵn trên máy chủ của tôi.
CÓ MAX (CASE KHI topsources.USER_ID = 'xxxx' THÌ 1 ELSE 0 END) = 0 phần này là vấn đề nhất tôi nghĩ hãy để tôi nghĩ làm thế nào để làm điều này tốt hơn – Jester
nó muốn giúp đỡ để đăng đầu ra chính xác từ giải thích –
Cập nhật diễn ra trong khi bạn đang chạy truy vấn? –