Можно ли индексировать все столбцы таблицы? - PullRequest
1 голос
/ 04 мая 2011

Скажем, у меня есть таблица с именем materials

materials таблица содержит столбцы

item name | item description | stock date | sale date| price |

В некоторых случаях мне может понадобиться результат сортировки по item name и по item description, по stock date, по sale date и price.

Так, как я проектирую таблицу согласно вышеупомянутым критериям? И как мне добавить индекс для всех столбцов? Нужно ли добавлять индекс ко всем?

Любая помощь?

ну в моей таблице будет более миллиона строк

Я использую PHP и MySQL

Ответы [ 7 ]

2 голосов
/ 04 мая 2011

Стоит прочитать http://use -the-index-luke.com / - да, вы можете индексировать каждый столбец; это редко принесет пользу, потому что вам нужно настроить индексы для запросов, которые вы на самом деле выполняете.

2 голосов
/ 04 мая 2011

Нет причины, по которой вы не можете иметь индекс для каждого столбца, если это поможет.Вы должны иметь в виду последствия индексации, такие как замедление вставки / удаления.Вам необходимо взвесить все за и против.

Чтобы создать индекс ...

http://dev.mysql.com/doc/refman/5.0/en/create-index.html

0 голосов
/ 04 мая 2011

Зачем использовать индекс

Индексы используются для двух вещей.

  1. Выбор предметов
  2. Сортировка списка

Для выбора элементов нужен индекс, поскольку поиск по всем записям невозможен.

Однако, если вы когда-либо select 100 элементов одновременно, MySQL может легко отсортировать эти элементы на месте без использования индекса.

Итак, сначала поместите индексы в элементы, которые есть в ваших предложениях where и join.
Затем посмотрите, сколько элементов вы выбираете за запрос. Если это меньше, чем, скажем, 200, я бы не стал беспокоиться об индексах для сортировки.

Добавление индекса

CREATE INDEX index_name ON tbl_name (цена)

См .: http://dev.mysql.com/doc/refman/5.1/en/create-index.html

Для всех параметров вы можете указать индекс.

Создание таблицы

Мое предложение:

CREATE TABLE materials (
  id integer not null autoincrement primary key,
  name varchar not null,
  description varchar not null,
  stockdate date not null,
  saledate date not null,
  price decimal(10,2) not null,
  /*my suggestion, put an index on all, but not on description*/
  INDEX `i_name` (name),
  INDEX `i_stockdate` (stockdate),
  INDEX `i_saledate` (saledate),
  INDEX `i_price` (price)) ENGINE = MyISAM;

Если вы выберите в описании в предложении where, то добавьте полнотекстовый индекс в описании.

CREATE FULLTEXT INDEX i_description ON materials (description);

Если вы сортируете только по описанию , не не добавляйте индекс, это не стоит ИМО.

0 голосов
/ 04 мая 2011

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

Как уже говорили другие, будьте осторожны с количествоминдексы: все индексы должны обновляться при каждой вставке или обновлении.Вы действительно хотите отсортировать товары по описанию ?

0 голосов
/ 04 мая 2011

индексы должны быть созданы на основе критериев, простой пример в вашем случае может быть, что вы можете искать в вашей таблице предметы, которые имеют определенную цену.Индексом для этого должны быть имя предмета, описание предмета и цена.

Я склонен планировать таблицу так, чтобы я знал, что я могу сделать, и затем создавать индексы соответственно.Таким образом, у вас может быть функция, которая getsItemsBySaleDate() или getItemsCheaperThan() и т. Д. ... оба они будут иметь разные индексы, так как оба будут искать разные столбцы в таблице.Я бы предложил на данный момент просто создать индекс для каждого столбца в таблице.

Я бы также добавил один для:

item_search => itemname, itemdescription, price
0 голосов
/ 04 мая 2011

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

Обратите внимание, что сканирование индекса не обязательно происходит быстрее: если вы хотите, чтобы все (или даже значительная часть) записей были возвращены, то filesort, скорее всего, будет более эффективным (если ваши таблицы не очень большие, в этом случае вы все равно не хочу все записи).

Индексы помогут, только если вы используете ORDER BY вместе с LIMIT.

0 голосов
/ 04 мая 2011

Взгляните на ЗАКАЗАТЬ

Добавление индекса по столбцу ускоряет поисковые запросы, но замедляет вставку / удаление. Однако сначала заставьте ваше приложение работать, а потом оптимизируйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...