我有以下查詢來獲取門票串列。
EXPLAIN select * from ticket_type
where ticket_type.event_id='89898'
and ticket_type.active=true
and (ticket_type.is_unlimited = true OR ticket_type.number_of_sold_tickets < ticket_type.number_of_tickets)
order by ticket_type.ticket_type_order
我創建了以下索引但不起作用。
- 索引 (ticket_type_order,event_id,is_unlimited,active)
- 索引 (ticket_type_order,event_id,active,number_of_sold_tickets,number_of_tickets)。
uj5u.com熱心網友回復:
此查詢的完美索引是
CREATE INDEX ON ticket_type (event_id, ticket_type_order)
WHERE active AND (is_unlimited OR number_of_sold_tickets < number_of_tickets);
當然,像這樣的部分索引可能只對這個特定查詢有用。
如果WHERE索引定義中的條件不是很有選擇性,或者執行速度稍慢也是可以接受的,則可以省略部分或整個WHERE子句。這使得索引更廣泛地有用。
uj5u.com熱心網友回復:
表的大小和通常的查詢結果是多少?服務器通常足夠智能并禁用索引,如果它期望回傳超過表的一半。
如果結果相當小,則索引沒有意義。如果服務器在幾個過濾步驟后有 - 比方說 - 1000 條記錄,服務器將停止使用索引。使用 CPU 完成查詢,然后從 HDD 加載索引更便宜。因此,索引永遠不會應用于小表。
Order by在查詢處理的最后應用。索引中的第一個欄位應該是where過濾器中的一個欄位。
布爾欄位在索引中很少有用。它只有兩個可能的值。應該為具有許多不同值的欄位創建索引。
避免or過濾。你的情況很容易。number_of_tickets如果門票是無限的,則在 中輸入一個非常大的數字。
在您的情況下,更好的索引就是event_id. 如果資料庫服務器支持功能索引,那么可以嘗試添加number_of_tickets - number_of_sold_tickets. 將陳述句改寫為where number_of_tickets - number_of_sold_tickets > 0
更新:Postgresql 稱其為“運算式索引”:
https://www.postgresql.org/docs/current/indexes-expressional.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/313938.html
標籤:PostgreSQL 索引
上一篇:如何在原始SQL中查詢?
