Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
Индексы в Mysql (Дмитрий) 28/06/2007 - 14:10:51



From: Дмитрий - 28/06/2007 - 14:10:51
Subject:Индексы в Mysql
-----------------
Есть база(Ключей уже всяких накидал):
CREATE TABLE `log` (
`username` varchar(50) default NULL,
`text-action` smallint(6) unsigned NOT NULL default '0',
`src_email` varchar(50) default NULL,
`dst_email` text,
`src_ip` varchar(15) default NULL,
`hostname` varchar(255) default NULL,
`helo_ip` varchar(255) default NULL,
`size` int(11) default NULL,
`date-time` timestamp NOT NULL default CURRENT_TIMESTAMP,
KEY `text-action` (`text-action`),
KEY `src_email` (`src_email`),
KEY `hostname` (`hostname`),
KEY `helo_ip` (`helo_ip`),
KEY `date-time` (`date-time`),
KEY `text-date` (`text-action`,`date-time`)
) ENGINE=InnoDB DEFAULT CHARSET=koi8r COMMENT='Таблица логов'

По русски проблема звучит так(сами запросы ниже):
Запрос номер 1 при поиске в базе будет обрабатывать 149 строк (это нормально, индекс работает)
Запрос номер 2 при поиске в базе будет обрабатывать 2322 строк (Это все имеющиеся в базе на данный момент)
За месяц строк будет 100 000, за год 1 000 000 - вот нафиг он их будет все обрабатывать(просматривать), когда можно диапазон уменьшить индексами. (С ростом базы время на запрос будет уходить всё больше и больше про запросу номер 2)

Почему не используются индексы хотябы даты и времени, ведь они есть в запросе, зачем всю базу лопатить?

Есть запрос 1:
explain SELECT count(1) FROM log WHERE (`date-time` BETWEEN '2007-06-27' AND '2007-06-27' + INTERVAL 1 DAY) AND `text-action` = '32' AND ( dst_email LIKE '%user@domain.ru%' );
+----+-------------+-------+-------+---------------------------------+-----------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+-------+---------------------------------+-----------+---------+------+------+-------------+
| 1 | SIMPLE | log | range | text-action,date-time,text-date | text-date | 6 | NULL | 149 | Using where |
+----+-------------+-------+-------+---------------------------------+-----------+---------+------+------+-------------+

Есть другой запрос 2: (Отличие только в знаке отрицания !='32' - не равно 32)
explain SELECT count(1) FROM log WHERE (`date-time` BETWEEN '2007-06-27' AND '2007-06-27' + INTERVAL 1 DAY) AND `text-action` != '32' AND ( dst_email LIKE '%user@domain.ru%' );
+----+-------------+-------+------+---------------------------------+------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+------+---------------------------------+------+---------+------+------+-------------+
| 1 | SIMPLE | log | ALL | text-action,date-time,text-date | NULL | NULL | NULL | 2322 | Using where |
+----+-------------+-------+------+---------------------------------+------+---------+------+------+-------------+

Теперь собственно ломаю голову, почему в 1 случае поле type=range и соответственно поиск идёт только по нужным данным. (это хорошо)
А во втором = ALL (Что не есть гуд и поиск идёт по всем данным)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
31739



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |