簡體   English   中英

按列排序應該有索引嗎?

[英]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 高於非索引列。

有關查詢標​​准和性能的更詳細分析,您可以參考以下鏈接:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM