この私のテーブル:日付columとtest_logにインデックス化され最適化MySQLのクエリ
SELECT d.date, COUNT(l.id)
FROM test_dates d
LEFT JOIN test_log l ON l.timest>=d.date AND l.timest<d.date + INTERVAL 1 DAY
GROUP BY d.date
テーブルtest_datesを:
CREATE TABLE IF NOT EXISTS `test_dates` (
`date` date NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `test_log` (
`id` int(10) unsigned NOT NULL,
`timest` datetime NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
ALTER TABLE `test_dates`
ADD PRIMARY KEY (`date`);
ALTER TABLE `test_log`
ADD PRIMARY KEY (`id`),
ADD KEY `emissione` (`timest`);
私は、日付ごとにログをカウントするには、このクエリを持っています表はタイム・スタンプの列で索引付けされます。
しかし、このクエリを説明すると、クエリの種類が「すべて」でNULLキーが得られました。
+-----+--------------+--------+-------------+--------+----------------+----------+----------+------+--------+-----------+------------------------------------------------+--+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | |
+-----+--------------+--------+-------------+--------+----------------+----------+----------+------+--------+-----------+------------------------------------------------+--+
| 1 | SIMPLE | d | NULL | index | PRIMARY | PRIMARY | 3 | NULL | 705 | 100.00 | Using index | |
| 1 | SIMPLE | l | NULL | ALL | emissione | NULL | NULL | NULL | 98256 | 100.00 | Range checked for each record (index map: 0x2) | |
+-----+--------------+--------+-------------+--------+----------------+----------+----------+------+--------+-----------+------------------------------------------------+--+
なぜテーブルインデックスを使用できないのですか?
ログテーブルは約100000行あり、クエリは非常に遅いです。
おそらくクエリが遅いですか?最低限、クエリのパフォーマンスに関する質問には、すべての関連するテーブル(および好ましくはサンプルデータも)のCREATEステートメントと、EXPLAINの結果が必要です。 – Strawberry
私はそれを更新しています。 – Tobia