Mysql

當 where 子句已經被索引時,是否應該索引 select max 的值

  • December 21, 2013

customer_orders在一個模式中有一個表,旨在在多個公司之間共享。每個customer_order都有一個invoice應該始終從 1 開始並根據公司遞增的數字(每個公司都有自己的發票計數)。

當我創建一個新的customer_order時,我有這個查詢來獲取該公司的最大發票編號並增加它。

select max(invoice) from customer_orders where customer_id = :customer_id

因為customer_id已經有了索引,添加索引有什麼意義invoice嗎?

在此處輸入圖像描述

該數據庫在生產中的 MySQL 和用於測試和開發的 sqlite3 上(ruby on rails)。

在您的情況下,(發票)上的索引通常是相當沒有意義的,因為有許多具有相同編號的發票,並且發票編號本身在您的設計中幾乎完全沒有意義,而不知道它屬於哪個客戶……所以你應該UNIQUE在 (customer_id,invoice) 上有一個索引。

ALTER TABLE customer_orders ADD UNIQUE KEY (customer_id,invoice); -- MySQL syntax

這個聲明創建了一個索引和一個約束——它允許伺服器快速轉到適當的 customer_id,然後快速轉到與該客戶 ID 關聯的最大值,所有這些都使用新的索引……它還限制你出於任何原因無意中複製發票編號 - 數據庫將拒絕允許給定的 customer_id 有兩行具有相同值的“發票”但仍允許“發票”值在不同的客戶上重複使用,這聽起來像你需要什麼。

<題外話> 如果生產是在 MySQL 上,我建議在 MySQL 上進行開發和測試。支持比您需要的更多的 DBMS 可能會帶來比其價值更多的麻煩,如果 SQLite 和 MySQL 在某些情況下行為不同,您可能會在生產中遇到意外。他們肯定不太可能統一優化查詢,如果您沒有使用與生產中使用的相同的底層數據庫進行測試,那麼我建議您真的沒有“測試”。</題外話>

引用自:https://dba.stackexchange.com/questions/55381