Общие вопросы об индексе и MySQL - PullRequest
2 голосов
/ 29 января 2011

Я пытаюсь лучше понять индексы, когда использую Mysql.Одна из проблем заключается в том, что мне все еще трудно определить, какой тип индексов мне следует использовать, например, отдельные индексы, многостолбцовые индексы, покрывающие индексы и т. Д.какой тип индексов использовать?Когда я проектирую свой макет базы данных, я не знаю точно, какие все запросы будут использоваться, пока приложение не будет построено.Для одной таблицы я мог бы запросить одно или несколько полей, а также запросить ее для отчетов.Поэтому, если я сделаю запрос к таблице следующим образом:

SELECT * FROM table1 WHERE field1 = this AND field2 = that GROUP BY field3 ORDER BY field4

Буду ли я создавать индекс из нескольких столбцов для field1, field3, field3 и field4?

И что делать, если у меня другой запрос натакая же таблица, как:

SELECT * FROM table1 WHERE field1 = this and field3 = that

Если бы у меня был индекс из нескольких столбцов из первого запроса, будет ли этот же индекс работать для второго запроса, поскольку field1 находится в самом дальнем левом углу индекса?

И другой вопрос, который у меня возник, был: есть ли определенный порядок, в котором mysql ищет индексы?Таким образом, для нескольких столбцов или индекса покрытия я должен добавить индексы в порядке предложения where?Тогда что-нибудь в предложении группы тогда что-нибудь в предложении заказа?Или mysql автоматически делает это?

Извините за все вопросы, просто ищу помощь по этому вопросу.

Ответы [ 2 ]

2 голосов
/ 29 января 2011

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

Правильно.Не создавайте индексы, пока не узнаете все запросы.Можно добавлять, изменять, изменять и удалять индексы.Действительно, хорошие дизайнеры меняют индексы по мере изменения использования программного обеспечения.

Буду ли я создавать многостолбцовый индекс для field1, field3, field3 и field4?

Редко.

Если у меня был индекс с несколькими столбцами из первого запроса, будет ли этот индекс работать для второго запроса, поскольку поле field1 находится в самом дальнем левом углу индекса?

Нет.

И еще один вопрос, который у меня возник, был: есть ли определенный порядок, в котором mysql ищет индексы?

Нет.

Так что для несколькихстолбец или закрывающий индекс мне добавлять индексы в порядке предложения where?

Нет

Тогда что-нибудь в предложении группы, тогда что-нибудь в предложении порядка?

Нет.

Или mysql автоматически делает это?

Более или менее.

Вотrule.

  1. Разработка базы данных.

  2. Запись запросов.

  3. Поиск наиболее распространенныхзапросы.20% ваших запросов выполняют 80% работы.Сосредоточьтесь на нескольких медленных запросах, для которых нужны индексы.

  4. Объясните планы выполнения запросов только для самых распространенных запросов.Для этого есть оператор EXPLAIN.

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

  6. Теперь самое сложное.Попробуйте разные индексы, пока (а) план объяснения не будет выглядеть оптимально и (б) измеренная производительность запросов не будет соответствовать вашим ожиданиям.

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

Вы не строите индексы для всех запросов.

Сосредоточьтесь на 20% запросов, которые стоят 80% времени.

2 голосов
/ 29 января 2011
  • Двигатель

Сначала вы должны решить, какой Двигатель вы хотите использовать для данной таблицы

  1. InnoDB предпочтительнее (транзакции ...), но не предлагает полный текст индекс
  2. Если вам нужен индекс fulltext , вы должны выбрать MyISAM

(Полнотекстовый индекс сохраняет индекс на основе слов в столбце)

  • Таблица

Вы должны знать, что MySQL использует только один индекс на максимум таблицы при объединении . Поэтому не ожидайте, что MySQL объединит два индекса данной таблицы.

  • Multi-колонки

Выбор порядка столбца на основе запросов, при условии, что MySQL может использовать top индекса, если необходимо

Например

  CREATE INDEX myindex ON mytable (col1,col2,col3)

MySQL может использовать (col1), (col1, col2) и (col1, col2, col3) в качестве индекса. Итак, чтобы ответить на ваш вопрос, ваш индекс должен быть создан на

  (field1,field3,field2,field4).

так как ваши два запроса нужны (field1, field3) и (field1, field2, field3, field4).

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