Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно расставить индексы?
 
 автор: JIEXA   (04.08.2006 в 02:27)   письмо автору
 
 

Вообщем сколько я не читал мануала по мускулу, всё равно толком непонимаю. Пришел за помощью. Вот к примеру есть запрос:

SELECT news_id FROM news WHERE news_active='1' and news_open='1' and news_main='1' and news_datestamp < now() ORDER BY news_dateorder DESC limit 0, 15

Не могли бы пояснить мне, на какие столбцы здесь надо ставить индексы и почему?

   
 
 автор: cheops   (04.08.2006 в 12:29)   письмо автору
 
   для: JIEXA   (04.08.2006 в 02:27)
 

Приведите структуру таблицы, если не сложно?

   
 
 автор: JIEXA   (04.08.2006 в 13:46)   письмо автору
 
   для: cheops   (04.08.2006 в 12:29)
 


CREATE TABLE 'news' (
  'news_id' int(9) unsigned NOT NULL auto_increment,
  'news_cat' smallint(5) NOT NULL default '0',
  'news_subject' varchar(80) NOT NULL default '',
  'news_text' longtext NOT NULL,
  'news_breaks' enum('0','1') NOT NULL default '0',
  'news_author' varchar(30) NOT NULL default '',
  'news_datestamp' datetime NOT NULL default '0000-00-00 00:00:00',
  'news_dateorder' datetime NOT NULL default '0000-00-00 00:00:00',
  'news_reads' int(12) unsigned NOT NULL default '0',
  'news_comment' smallint(10) unsigned NOT NULL default '0',
  'news_active' enum('0','1') NOT NULL default '1',
  'news_open' enum('0','1') NOT NULL default '1',
  'news_main' enum('0','1') NOT NULL default '1',
  'news_vote' enum('0','1') NOT NULL default '0',
  PRIMARY KEY  ('news_id'),
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

   
 
 автор: cheops   (04.08.2006 в 14:58)   письмо автору
 
   для: JIEXA   (04.08.2006 в 13:46)
 

А запросы только такие? В этом случае нужно организовать один индекс по трём столбцам news_active, news_open и news_main.

   
 
 автор: JIEXA   (04.08.2006 в 16:23)   письмо автору
 
   для: cheops   (04.08.2006 в 14:58)
 

А инедкс для news_datestamp и news_dateorder нинадо?

   
 
 автор: cheops   (04.08.2006 в 22:11)   письмо автору
 
   для: JIEXA   (04.08.2006 в 16:23)
 

Можно для news_dateorder отдельный индекс создать.

   
 
 автор: JIEXA   (04.08.2006 в 23:50)   письмо автору
 
   для: cheops   (04.08.2006 в 22:11)
 

Спасибо, тоесть индексы надо создавать для полей, которые стоят в WHERE также для полей по которым идет сортировка?

P.S. Надо перечитать материал про индексы в вашей книге... А то я читал что-то, но всё равно не допер :(

   
 
 автор: JIEXA   (04.08.2006 в 23:56)   письмо автору
 
   для: cheops   (04.08.2006 в 22:11)
 

Хм, сделал один индекс для трех полей news_open, news_main, news_active и отдельный для news_dateorder. И время выполнения запроса увеличилось в три раза. Убрал.. Оставил только news_dateorder и время генерации уменьшилось в 2 раза, чем было до указания каких-либо индексов. Но почему? Почему индекс по трем полям (news_open, news_main, news_active) замедляет время выполнения запроса? Ведь должно быть наоборот

   
 
 автор: cheops   (05.08.2006 в 10:30)   письмо автору
 
   для: JIEXA   (04.08.2006 в 23:56)
 

Объём таблиц большой? Если да, это вполне вероятно. Часто ли выполняется запрос?

   
 
 автор: JIEXA   (05.08.2006 в 10:49)   письмо автору
 
   для: cheops   (05.08.2006 в 10:30)
 

Примерно 15.000 записисей, запрос выполняется порядко 50 раз в минуту как минимум

   
 
 автор: cheops   (05.08.2006 в 11:06)   письмо автору
 
   для: JIEXA   (05.08.2006 в 10:49)
 

Хм... странно, таблица вроде не большая, а частота приличная, если бы индекс использовался бы - он бы 100% был бы в кэше индексов.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования