[英]How to avoid full table scan for mutliple searcheable columns query?
我有一個下表:
id | col1 | col2 | col3 | ... | col66
-------------------------------------
999| 1 | 0 | 0 | ... | 1
colX的所有列都是可搜索的,其中有66列,這意味着不可能創建有效的索引(至少我認為是這樣)。
查詢可能看起來像這樣:
SELECT id FROM tableA WHERE col21=1 AND col31=1 AND col64=1
如您所見,我只需要檢索某些列設置為“ 1”的行。 列的集合可能會有所不同。 您是否知道沒有耗時的全表掃描的任何方式? 我想我已經嘗試了一切,但沒有運氣:-(謝謝!
為了這樣的查詢:
SELECT id FROM tableA WHERE col21=1 AND col31=1 AND col64=1
為了快速工作,您必須創建包含上述所有字段的復合索引: (col21, col31, col64)
。 我猜您無法預先預測所需字段的列表,因此它可能對您不起作用-除非您願意創建大量索引。
更好的選擇是規范化表-創建從表,該表將在一個單獨的行中存儲一個屬性。 這將使索引編制變得容易得多,並且還可以保留任意數量的屬性。
更新 : 另一種可能性是用位圖替換0/1列。 如果今天您有一個32位主鍵和66個int小列,則行寬為4 + 66 = 70字節。 如果使用BIT數據類型(您將需要2位列,假設MySQL中的最大BIT大小為64位),則行寬變為4+(66/8)= 13字節,幾乎是以前的5倍。 如果今天您的完整掃描時間為0.4秒,使用此包裝,它將為0.08秒,您可能會接受。
您可以使用以下方式更改表的結構:
id type value
999 col1 1
999 col2 0
---
而且,如果您認為需要它,可以添加一個人工PK,這里的關鍵是要在類型和值上有一個復合索引: INDEX (type,value)
這樣您的查詢將使用該索引,並且搜索會更快。
您的查詢將轉換為:
SELECT
id
FROM
tableA
WHERE
type IN ('col21','col31','col64')
AND value = 1
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.