RU 
Регистрация

хостинг: ValueHost 2.0
           

Помощь


Акции:

Бонус за друга!

Индексация таблиц

Зачастую случается так, что сайт начинает "тормозить". Далеко не всегда причина в неполадках на сервере.
Не редко случается что проблема в базе данных, а именно в запросах к ней.
При получении запроса select mysql последовательно проверяет записи в таблице и сверяет их на совпадение с задаными условиями.
Если записей 10-20 производительность будет вполне хорошая и никто не заметит подвоха. Проблемная ситуация начинается, когда база "разрастается", и записей становится на порядок больше.
Например, при нескольких десятках тысяч записей уже будет видна деградация во времени исполнения такого запроса.

В этой ситуации стоит вспомнить про существование такой вещи как индексы. Индексы представляют собой b-деревья, а поиск по ним будет в разы быстрее, чем последовательный обход кучи данных.
Индексов всего 3 типа: PRIMARY, UNIQUE, и INDEX. Какой и когда использовать, можно всегда посмотреть в официальной документации по Mysql.

Как же правильно решить, по каким полям их создавать? Универсального рецепта нет. Нужно анализировать запросы к базе и на основании этой информации уже решать.

Но пару советов дать можно:
1) если идет выборка по 1-му полю из большого количества данных, то можно только по нему и создать индекс.
2) если выборка по сложному условию:
а) с использованием and - нужно делать составной индекс сразу по нескольким полям, а, возможно, и несколько составных индексов, зависит от того, что в условии. Так же можно создать просто несколько индексов по полям, которые используются в условии, но составной индекс в данном случае даст выигрыш по времени выполнения запроса.
б) с использованием or - составные индексы работать не будут, поэтому нужно делать несколько индексов по полям, которые участвуют в запросах.
В общем виде, синтаксис добавления индекса будет выглядеть так:

ALTER TABLE tbl_name ADD INDEX [index_name] (index_col_name,...)
ALTER TABLE tbl_name ADD PRIMARY KEY (index_col_name,...)
ALTER TABLE tbl_name ADD UNIQUE [index_name] (index_col_name,...)

При использовании primary и unique индексов есть некоторые особенности, которые есть в официальной документации по Mysql. Здесь мы их описывать не будем. Но если Вы их не знаете - прочтите документацию прежде, чем что-то делать.

Допустим, есть таблица:

CREATE TABLE
`users` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`name` CHAR(30) NOT NULL,
`city` CHAR(30) NOT NULL,
`address` CHAR(30) NOT NULL,
`post_code` SMALLINT(10) NOT NULL,
`age` SMALLINT(6) NOT NULL,
PRIMARY KEY(`id`)
)


И есть несколько запросов:
1)select * from users where 'name' like '%alex%' or 'city'='Moscow';
2)select * from users where 'id'='35';
3)select * from users where 'post_code'='192000' and 'city'='St.Petersburg'

В первом случае лучше всего будет создать два индекса. Один по полю name, второй по полю city:
ALTER TABLE users ADD INDEX (`name`);
ALTER TABLE users ADD INDEX (`city`);

Во втором случае можно не создавать индексов, т.к. по полю Id он уже создан (ключевое слово primary).

В третьем случае лучше будет создать составной индекс по полям post_code и city:
ALTER TABLE users ADD INDEX (`post_code`, `city`);

Если Вы не уверены, какие нужно создавать индексы и по каким полям - обратитесь к разработчику Вашего сайта, лучше всего он будет знать, как в данном случае нужно поступить, т.к. видит проект "изнутри".
В случае использования бесплатных cms (wordpress, joomla и т.д.) стоит обратить внимание на официальные ресурсы по Вашей cms. Зачастую многие вопросы касательно баз данных там обсуждались.