簡體   English   中英

如何避免對多可搜索列查詢進行全表掃描?

[英]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.

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