Создание индексов для моей таблицы sql для запроса с предложениями «где» и «порядок по» - PullRequest
3 голосов
/ 18 февраля 2020

У меня есть таблица в mysql дБ. Мой запрос выглядит так:

SELECT device_id,date,timestamp,power,floor 
from tableData 
where date=%s 
and floor=%s 
order by timestamp desc 
limit 1

Я создал индекс для своей таблицы для более быстрых результатов. Мои индексы:

+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| minionData |          1 | idx1     |            1 | date        | A         |        9447 |     NULL | NULL   | YES  | BTREE      |         |               |
| minionData |          1 | idx1     |            2 | floor       | A         |       12072 |     NULL | NULL   | YES  | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

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

Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

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

Для начала: оптимизировать предложение where, вам понадобится составной индекс для обоих столбцов, например:

tableData(date, floor)

Но чтобы сделать это еще более эффективным, вы также можете добавить столбец, который используется для сортировки в индексе, так:

tableData(date, floor, timestamp)

Если вы используете MySQL 8.0, вы можете сделать индекс по убыванию по столбцу timestamp:

tableData(date, floor, timestamp desc)

Наконец: одним из вариантов будет добавление других столбцов, которые вы select в индексе, чтобы сделать его охватывающим индекс; это может позволить выполнить весь запрос с использованием только индекса (ie без просмотра данных таблицы):

tableData(date, floor, timestamp desc, device_id, power) 

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

1 голос
/ 18 февраля 2020

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

Просто используйте tableData (date, floor)

...