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

Форум MySQL

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

 

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

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

тема: Как проиндексировать таблицу?
 
 автор: tAleks   (06.03.2007 в 10:54)   письмо автору
 
 

Есть таблица, для хранения статей:

CREATE TABLE `articles` (
  `id_article` int(11) NOT NULL auto_increment,
  `name` tinytext,
  `description` tinytext,
  `html_title` tinytext,
  `html_description` tinytext,
  `html_keywords` tinytext,
  `pos` int(11) default NULL,
  `showhide` enum('show','hide') default 'hide',
  `datetime` datetime default NULL,
  `ann` enum('1','0') default '0',
  `id_group` int(11) default NULL,
  PRIMARY KEY  (`id_article`)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 COMMENT='Метаданные статей' AUTO_INCREMENT=85 ;


Назначения всех полей, я думаю понятно, кроме "ann". "ann" - это поле - флаг "Анонсировать статью на гл. станице сайта."

Подскажите какие поля проиндексировать.

У меня сортировка и/или выборка данных буедт производиться по этим полям:

`pos` int(11) default NULL,
`showhide` enum('show','hide') default 'hide',
`datetime` datetime default NULL,
`ann` enum('1','0') default '0',
`id_group` int(11) default NULL,


Но, получается что проиндексировать надо пол таблицы. Не лишку?

И как лучше проиндексировать? Все поля в один индекс, или для каждого поля свой индекс?

   
 
 автор: cheops   (06.03.2007 в 12:50)   письмо автору
 
   для: tAleks   (06.03.2007 в 10:54)
 

Как точно выглядят WHERE-условия? Индексировать лучше наиболее часто-используемые записи. showhide и ann лучше вообще не индексировать.

   
 
 автор: tAleks   (06.03.2007 в 16:12)   письмо автору
 
   для: cheops   (06.03.2007 в 12:50)
 

один из запросов, обращающихся к этой таблице выглядит так:

$sql_art = "
    SELECT
        id_article,
        name,
        description,
        DATE_FORMAT(datetime, '%d.%m.%y') AS date
    FROM articles
    WHERE showhide = 'show' AND ann = '1'
    ORDER BY datetime DESC LIMIT 5";


А почему showhide и ann лучше вообще не индексировать? Они же используются в WHERE.
Или не надо индексировать, потому что они ENUM?

   
 
 автор: cheops   (06.03.2007 в 22:26)   письмо автору
 
   для: tAleks   (06.03.2007 в 16:12)
 

Да, потому, что ENUM и слишком мало значений - выигрыш в скорости может быть не большой, а индексы будут занимать место на диске (а чем больше места занимается, тем ниже скорость).

PS А почему к индексации прибегаете - скорость выполнения запроса низкая?

   
 
 автор: tAleks   (07.03.2007 в 12:41)   письмо автору
 
   для: cheops   (06.03.2007 в 22:26)
 

>PS А почему к индексации прибегаете - скорость выполнения запроса низкая?

Не знаю, про скорость еще ничего. Сайт только на локальной машине, и статей еще не много. Но когда изучал MySQL по книжке "Самоучитель MySQL 5". Там написано, что обычно индексы создаются при создании таблицы. Вот я и решил сразу проиндексировать те поля, по которым буду делать выборку.

А что, что-то не так? Рано индексирую?

   
 
 автор: tAleks   (07.03.2007 в 12:58)   письмо автору
 
   для: cheops   (06.03.2007 в 22:26)
 

Вот еще что подумал. А если в таблице буедт мало даных. Например таблица в которой храняться типы валют (руб. доллары. евры, и пр.). Их заведомо будет не больше 20.

Так вот, есть ли смысл вообще индексировать такие таблицы?
И после скольки строк в таблице, есть смысл ее индексирования?

   
 
 автор: Unreal   (07.03.2007 в 13:06)   письмо автору
 
   для: tAleks   (07.03.2007 в 12:58)
 

двухядерный процессор, гектар оперативки, винт 10000 оборотов
у меня сейчас есть бд, в ней ~610,000 строк, написал скрипт который переклыдывает данные из одной таблицы 73.000 строк в две других при этом сравнивает данные по двум другим таблицам

индексов нет в mysql administrator (gui) среднее число запросов: 14, максимальное ~120

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

   
 
 автор: cheops   (07.03.2007 в 13:30)   письмо автору
 
   для: tAleks   (07.03.2007 в 12:58)
 

Нет мелкие таблицы имеет смысл индексировать, только если они участвуют в многотабличных запросах.

   
 
 автор: tAleks   (08.03.2007 в 13:35)   письмо автору
 
   для: cheops   (07.03.2007 в 13:30)
 

А какие столбцы индексировать? Которые связки?

   
Rambler's Top100
вверх

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