Индексация таблицЗачастую случается так, что сайт начинает "тормозить". Далеко не всегда причина в неполадках на сервере. Не редко случается что проблема в базе данных, а именно в запросах к ней. При получении запроса 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. Зачастую многие вопросы касательно баз данных там обсуждались.
|
|