Mysql
當 where 子句已經被索引時,是否應該索引 select max 的值
我
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 在某些情況下行為不同,您可能會在生產中遇到意外。他們肯定不太可能統一優化查詢,如果您沒有使用與生產中使用的相同的底層數據庫進行測試,那麼我建議您真的沒有“測試”。</題外話>