camka
не самка
Идентичные запросы отрабатывают странно. надо расставить индексы.
Имеется две таблицы.
первая - статистика поиска слов для отдельных сайтов по дням. query - ссылка на айди слова во второй таблице
вторая - сами слова
делаю запрос
здесь надо обратить внимание на время выполнения каждого запроса
а теперь, соответсевенно эксплейны
судя по эксплейнам, просматриваемых рядов достаточно мало. вопрос - почему в первом запросе мускул не оптимизирует запрос до вида второго запроса, ведь в таблице r_search он найдет только одну запись соответствующую условию, используя индекс PRIMARY id.
-~{}~ 19.07.04 15:59:
решилось прямым указанием мускулу, какой индекс использовать
значит ли это, что нельзя доверять explain на 100%?
Имеется две таблицы.
Код:
CREATE TABLE `stat_search` (
`id` int(11) NOT NULL default '0',
`site` int(11) NOT NULL default '0',
`engine` int(11) NOT NULL default '0',
`query` int(11) NOT NULL default '0',
`hits` int(11) NOT NULL default '0',
`visits` int(11) NOT NULL default '0',
`clients` int(11) NOT NULL default '0',
KEY `query_id` (`query`,`id`),
KEY `id` (`id`,`site`)
) TYPE=MyISAM PACK_KEYS=1
CREATE TABLE `r_search` (
`id` int(11) NOT NULL auto_increment,
`k` varchar(255) binary default NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `k` (`k`),
KEY `id_k` (`id`,`k`)
) TYPE=MyISAM
вторая - сами слова
делаю запрос
Код:
mysql> select r.k, sum(hits) as totalhits from stat_search s inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and r.id = 3 group by s.id order by 1 desc ;
+-------+-----------+
| k | totalhits |
+-------+-----------+
| delfi | 2250 |
| delfi | 2167 |
+-------+-----------+
2 rows in set (3.71 sec)
mysql> select r.k, sum(hits) as totalhits from stat_search s inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and s.query = 3 group by s.id order by 1 desc ;
+-------+-----------+
| k | totalhits |
+-------+-----------+
| delfi | 2250 |
| delfi | 2167 |
+-------+-----------+
2 rows in set (0.02 sec)
а теперь, соответсевенно эксплейны
Код:
mysql> explain select r.k, sum(hits) as totalhits from stat_search s inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and r.id = 3 group by s.id order by 1 desc ;
+-------+-------+---------------+----------+---------+-------+------+-----------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+----------+---------+-------+------+-----------------+
| r | const | PRIMARY,id_k | PRIMARY | 4 | const | 1 | Using temporary |
| s | ref | query_id,id | query_id | 4 | const | 5 | Using where |
+-------+-------+---------------+----------+---------+-------+------+-----------------+
2 rows in set (0.01 sec)
mysql> explain select r.k, sum(hits) as totalhits from stat_search s inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and s.query = 3 group by s.id order by 1 desc ;
+-------+-------+---------------+----------+---------+---------+------+----------------------------------------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+----------+---------+---------+------+----------------------------------------------+
| s | range | query_id,id | query_id | 8 | NULL | 6 | Using where; Using temporary; Using filesort |
| r | ref | PRIMARY,id_k | id_k | 4 | s.query | 1 | Using index |
+-------+-------+---------------+----------+---------+---------+------+----------------------------------------------+
2 rows in set (0.00 sec)
-~{}~ 19.07.04 15:59:
решилось прямым указанием мускулу, какой индекс использовать
Код:
mysql> select r.k, sum(hits) as totalhits from stat_search s use index (id) inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and r.k = 'delfi' group by s.id order by 1 desc ;
+-------+-----------+
| k | totalhits |
+-------+-----------+
| delfi | 2250 |
| delfi | 2167 |
+-------+-----------+
2 rows in set (0.04 sec)
mysql> explain select r.k, sum(hits) as totalhits from stat_search s use index (id) inner join r_search r on s.query = r.id where site in ( 4) and s.id between 20040601 and 20040602 and r.k = 'delfi' group by s.id order by 1 desc ;
+-------+-------+---------------+------+---------+-------+------+-------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+-------+-------+---------------+------+---------+-------+------+-------------+
| r | const | PRIMARY,k | k | 256 | const | 1 | |
| s | range | id | id | 8 | NULL | 4573 | Using where |
+-------+-------+---------------+------+---------+-------+------+-------------+
2 rows in set (0.01 sec)