Порядок по столбцу должен иметь индекс или нет? - PullRequest
11 голосов
/ 20 января 2012

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

Ответы [ 4 ]

11 голосов
/ 20 января 2012

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

3 голосов
/ 20 января 2012

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

но

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

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

1 голос
/ 06 мая 2019

Это зависит от вашего запроса. 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

0 голосов
/ 03 ноября 2017

Использование 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
# User@Host: 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
# User@Host: 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

...