2012-04-08 50 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);