Порядок по столбцу должен иметь индекс или нет?

Я делаю индексы для таблицы с миллионами записей, которые используются для поиска результата. Я показываю результаты по порядку ASC или DESC. Мой вопрос в том, что столбец должен иметь индекс или нет? Я еще 2 указателя на эту таблицу. Как производительность повлияет на создание или отсутствие индекса в этом столбце?

Ответ 1

Порядок по столбцам используется для упорядочивания набора результатов, а не для фильтрации. Индекс столбцов, упомянутых в предложении order by, вряд ли что-либо изменит, особенно если он не используется для фильтрации данных.

Ответ 2

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

но

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

Итак, ответ как обычно - зависит

Ответ 3

Использование ORDER BY в индексированном столбце - не очень хорошая идея. На самом деле целью использования индекса является ускорение поиска, поэтому колонка индекса помогает поддерживать данные в отсортированном порядке. Я предлагаю вам использовать ORDER BY в неиндексированном столбце. Я выполнил образец запроса на MySql и получил результат, как указано ниже.

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size,
    ci.create_date AS item_create_date, cis.service_id, cis.quantity   
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE
    c.id = 144 
ORDER BY 
    c.create_date;

Здесь я использую ORDER BY для неиндексированного столбца create_date, и результат выглядит следующим образом:

# Time: 2017-11-03T10:30:33.237056Z
# [email protected]: root[root] @ localhost []  Id:     3
# Query_time: 0.000340  
# Lock_time: 0.000154 Rows_sent: 2  Rows_examined: 4

И теперь я собираюсь использовать ORDER BY в индексированном столбце item_id:

SELECT 
    ci.id AS item_id, ci.brand_id, ci.category_id, 
    ci.item_size_type, ci.is_express_processing, ci.packing, 
    ci.parent_service_id, ci.product_id, ci.size,
    ci.create_date AS item_create_date, cis.service_id, cis.quantity   
FROM 
    cart AS c 
INNER JOIN 
    cart_items AS ci ON ci.cart_id = c.id 
LEFT JOIN
    cart_item_services AS cis ON cis.item_id = ci.id 
WHERE
    c.id = 144 
ORDER BY 
    item_id;

Теперь я получил результат следующим образом.

# Time: 2017-11-03T10:30:47.802392Z
# [email protected]: root[root] @ localhost []  Id:     3
# Query_time: 0.000383  
# Lock_time: 0.000176 Rows_sent: 2  Rows_examined: 4

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

Для более подробного анализа стандартного запроса и производительности вы можете обратиться к ссылке ниже:

http://mysql.rjweb.org/doc.php/index_cookbook_mysql

Ответ 4

Это зависит от вашего запроса. MySQL может использовать составной индекс для предложения where и order by. Если вы явно включите предложение ORDER BY, которое содержит тот же список столбцов, MySQL оптимизирует его без какого-либо снижения скорости, хотя сортировка все еще происходит. Если запрос включает GROUP BY, но вы хотите избежать издержек при сортировке результата, вы можете отменить сортировку, указав ORDER BY NULL.

Подробнее

http://download.nust.na/pub6/mysql/doc/refman/5.1/en/order-by-optimization.html

Если вы плохо разбираетесь в оптимизации MySQL, лучше использовать некоторые хорошие инструменты, такие как SmartMySQL, которые могут определять лучшие индексы для ваших запросов на основе структуры таблицы и ее данных. Это бесплатный инструмент с графическим интерфейсом, который может оптимизировать запросы и ускорить разработку в 10 раз быстрее по сравнению с MySQL Workbench.

Вы можете скачать его с www.smartmysql.com