2009-12-26 67 views
0

我有3場一個MySQL表:添加字段以優化的MySQL查詢

  • 位置
  • 可變
  • 價值

我經常使用下面的查詢:

SELECT * 
    FROM Table 
WHERE Location = '$Location' 
    AND Variable = '$Variable' 
ORDER BY Location, Variable 

我有過在米百萬行表和查詢有點慢。如果我添加了一個字段VariableLocation,它是變量和位置組合,它會提高查詢速度嗎?我將能夠查詢更改爲:

SELECT * 
    FROM Table 
WHERE VariableLocation = '$Location$Variable' 
ORDER BY VariableLocation 

回答

-1

修正更新:

禮貌:@paxdiablo:

在表中的列將沒有什麼區別。所有你需要的是一個索引在兩列,MySQL引擎將使用它。在表格中添加一列實際上比這更糟,因爲它破壞了3NF並浪費了空間。見http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html其中指出:SELECT * FROM tbl_name WHERE col1=val1 AND col2=val2;如果col1和col2上存在多列索引,適當的行可以直接取出。

+0

-1 - 你能解釋一下爲什麼會在MySQL的如何管理數據或優化查詢方面發生的呢? – kdgregory 2009-12-28 17:27:27

+0

不,我不能向你解釋,至少因爲我不能像你做的那樣最初投票給你! – Sarfraz 2009-12-30 06:26:13

+0

如果你無法用已知的行爲來解釋某些事情,那麼你並沒有給出真正的答案。你沒有理由說「肯定會提高性能」,因爲你不知道爲什麼它會這樣做。事實上,你告訴OP究竟他/她想聽到什麼,最好是傳播無害的迷信,最壞的情況會使他/她的查詢表現得更差。將其與其他海報進行比較,他們實際上給出了添加索引的合理解釋。 – kdgregory 2009-12-31 13:30:34

2

嘗試增加覆蓋兩個字段,那麼你應該仍然可以得到性能的提升也使您的數據可以理解的,因爲它似乎並不像兩列應合併,但你只是在做它來獲得性能的指標。

6

我想補充一個覆蓋索引,對列locationvariable

ALTER TABLE 
    ADD INDEX (variable, location); 

...雖然如果變量&位置對是獨一無二的,他們應該是主鍵。

結合的列可能會導致更多的悲傷比它的價值。例如,如果你需要locationvariable拔出只記錄,你必須在串子查詢的值。

2

我會建議對相結合的領域。相反,創建覆蓋以相同的順序都字段作爲ORDER BY子句中的索引:

ALTER TABLE tablename ADD INDEX (location, variable); 

綜合指數和鑰匙在涉及讀取索引的所有字段或這些字段的一個子集的查詢只用於左到右。或換句話說:如果在WHERE條件中使用位置,將使用此索引,但按變量排序不會使用索引。

當試圖優化查詢,EXPLAIN命令是非常有幫助的:EXPLAIN in mysql docs