2012-04-08 56 views
2

假設我有這個表:的MySQL索引+查詢處理

create table table_a (
    id int, 
    name varchar(25), 
    address varchar(25), 
    primary key (id) 
) engine = innodb; 

當我運行此查詢:

select * from table_a where id >= 'x' and name = 'test'; 

如何將MySQL的過程呢?它會拉所有的id的第一(假設1000行),然後應用where子句名稱='測試'?

或者當它查找id時,它已經在同時應用where子句?

回答

2

由於id是PK(並且沒有名稱索引),它會將滿足基於id的標準的所有行加載到內存中,然後它將按名稱標準過濾結果集。添加包含兩個字段的組合索引意味着它只會加載滿足這兩個條件的記錄。在名稱字段中添加單獨的單列索引可能不會導致索引合併操作,在這種情況下索引不起作用。

+0

我不知道具有單獨的索引id和名稱將使具有相同的性能影響有一個組合索引。你確定嗎? – 2012-04-08 21:55:54

+0

@AtaS。 - 這取決於優化器。它可能會選擇進行索引合併,在這種情況下,它將具有與使用組合索引類似的性能優勢,但它可能不會。 - [索引合併優化](http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html) – nnichols 2012-04-08 22:05:43

+0

假設表有多個文本列,並且我仍然運行相同的查詢,那麼就像你說的那樣,它會先抓住所有的行,然後應用filter子句。在這種情況下,文本列在內存中放置非常昂貴。它是否正確? – Carmen 2012-04-09 00:37:42

0

你在任一列上都有索引嗎?這可能會影響執行計劃。另一件事是可能會施加'x':: int來確保數字比較而不是字符串比較。

0

爲了獲得最佳效果,您應該有一個包含列id和名稱的索引。

就你而言,我無法回答主索引對該查詢的影響。這取決於DBMS和版本。如果你真的不想放更多的索引(因爲更多的索引意味着緩慢的寫入和更新)只需用10.000.000個隨機結果填充你的表,試試看看效果。

0

您可以通過在查詢上運行EXPLAIN來獲取有關查詢處理方式的信息。

如果這個想法是,以優化查詢,那麼你可能要添加一個索引,如:

alter table table_a add unique index name_id_idx (name, id);