簡體   English   中英

MySql 多列索引

[英]MySql Indexing for multiple columns

我的表包含列 c1、c2、c3、c4、c5、c6,我有超過 64 個這樣的查詢組合

我的查詢是

  1. where (c1=1 and c2=2 and c3=3)
  2. where (c1=1 and c2=2 and c3=3 and c4 =4 and c5 =5 )
  3. where (c1=1 and c2=2 and c3=3 and c4=4)
  4. where (c1=1 and c2=2 and c3=3 and c6)
  5. where ( c2=2 and c3=3) ..等

我使用此查詢為多個列創建了索引

create INDEX `allpair` ON TABLE_NAME (c1,c2,c3,c4,c5,c6);

但它不適用於所有組合我是否需要為所有組合添加索引?

沒有好的答案。

您建議的索引有助於某些涉及c1=constant的查詢,但如果缺少該索引則無濟於事。 而且,您進入該多列索引的距離越遠,這些列的用處就越小。 也就是說,您的allpair對您的查詢 5 沒有用。

部分答案:

  • 構建“少數”2 列或 3 列索引。
  • 關注可能被測試的列=constant 這是因為“范圍”測試也沒有優化。
  • 傾向於以不同的第一列開始各種索引
  • 查看可能的查詢——您可能會在測試的列中發現字符串偏差。 在房地產中,大多數查詢包括“卧室數量”但不包括“有涼亭”。

如果您只有這 5 個查詢,那么INDEX(c2,c3,c1) (或INDEX(c3,c2,c1) )可能是最好的。

您無法提供所有組合。 一個表上有 64 個索引的硬性限制。 5-10 是實際限制。

常數是數字嗎? 你需要數字的“范圍”嗎? 其中一些是字符串嗎? [如果您通過僅顯示=number來過度簡化問題,您將阻止我提供其他一些解決方案。]

更多的

  • 范圍( >BETWEEN!=LIKE 'abc%' ,有時IN等)——索引不會超過該列 go 。 因此,傾向於將此類列放在復合索引的末尾。
  • WHERE中的 2 個范圍——優化器將決定使用哪個范圍; 通常它會選擇更好的一個。
  • FOREIGN KEY - 這是在INSERTingINDEX時使用的約束的組合,可能對SELECT有用。 添加外鍵時,如果已經有有用的INDEX ,則外鍵不會添加多余的索引。
  • 字符串( VARCHAR ,而不是TEXT )——當涉及到索引時,將它們想象成類似於數字。
  • DATEDATETIMETIMESTAMP (等等)——我們可以說,這些是美化的數字。 但是,它們通常用作“范圍”。
  • 數字、字符串和日期都可以參與=或范圍測試。 我的索引建議同樣適用於每一個。

有關索引的更多信息: Index CookbookEntity-Attribute-Value

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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