[英]Order by column should have index or not?
我正在向具有數百萬條記錄的表添加索引,這些記錄用於搜索結果。 我以 ASC 或 DESC 順序顯示結果。 我的問題是該列是否應該有索引? 我在該表上還有 2 個索引。 向該列添加或不添加索引將如何影響性能?
按列排序用於對結果集進行排序,而不是過濾。 order by 子句中提到的列上的索引不太可能改變任何內容,尤其是在不用於過濾數據的情況下。
實際上 - 對於數百萬行更好地應用一些經過深思熟慮的索引,它並不是那么大的數據集開始擔心空間性能問題。
但
如果您每天讀取該表一次並每秒更新/刪除行 100 次 - 那么索引的影響可能會降低主要操作的性能,而偶爾選擇會執行得更好。
所以,像往常一樣的答案 -這取決於
這取決於您的查詢。 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,它可以根據表結構及其數據為您的查詢確定最佳索引。 它是一款免費的 GUI 工具,與 MySQL 的 Workbench 相比,它可以優化查詢並加快您的開發速度 10 倍。
您可以從www.smartmysql.com下載它
在索引列上使用 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;
在這里,我在非索引列create_date
上使用ORDER BY
,結果如下:
# 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
現在我將在索引列item_id
上使用ORDER BY
:
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 高於非索引列。
有關查詢標准和性能的更詳細分析,您可以參考以下鏈接:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.