私のmysqlデータベースは、特に低速なクエリを実行しようとCPUを使いたくなっています。私が説明をするとき、mysqlは "whereを使う、一時的に使う、filesortを使う"と言っています。このパズルを解読し解決するのを助けてください。ヘルプのチューニングSQLクエリ
表構造:
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;
表は370K行...時々高いがあります。以下のクエリは10秒以上かかります。
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;
ここでは説明の拡張です:
+----+-------------+------------+------+---------------+---------------+---------+-------+--------+----------+----------------------------------------------+
| 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 |
+----+-------------+------------+------+---------------+----
----------- + --------- + ------- + - ------- + ---------- + ------------------------------- --------------- +
は、このクエリを改善する方法はありますか?また、CPUの負荷を軽減するのに役立つmysqlの設定はありますか?私は私のサーバーで利用可能なメモリをさらに割り当てることができます。トリックを行う必要があります
をtopsources.USER_ID =「XXXX」THEN 1つのELSE 0 END)= 0この部分は、私は私が – Jester
これよりよく行う方法を考えてみましょう考える最も問題ですクエリを実行していますか? –
は、更新があなたながら起こっている説明から、それは正確な出力を掲示するのに役立つだろう –