2

假设我有这张桌子:

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 子句 name = 'test'?

还是在寻找 id 时,它已经同时应用了 where 子句?

4

5 回答 5

2

由于 id 是 PK(并且没有名称索引),它会将满足基于 id 标准的所有行加载到内存中,之后它将按名称标准过滤结果集。添加包含两个字段的复合索引意味着它只会加载同时满足两个条件的记录。在名称字段上添加单独的单列索引可能不会导致索引合并操作,在这种情况下索引将不起作用。

于 2012-04-08T21:52:36.703 回答
0

您在任一列上都有索引吗?这可能会影响执行计划。另一件事是可以强制转换 'x'::int 以确保进行数字比较而不是字符串比较。

于 2012-04-08T21:44:49.653 回答
0

为获得最佳结果,您应该有一个包含 id 和 name 列的索引。

在您的情况下,我无法回答主索引对该查询的影响。这取决于 DBMS 和版本。如果您真的不想放置更多索引(因为更多索引意味着写入和更新速度较慢),只需使用 10.000.000 个随机结果填充您的表,试试看效果。

于 2012-04-08T21:52:11.800 回答
0

您可以通过在查询上运行来获取有关如何处理EXPLAIN查询的信息。

如果想法是优化该查询,那么您可能需要添加一个索引,例如:

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

于 2012-04-08T21:57:51.220 回答
0

您可以通过在 where 子句中首先执行 id 时首先执行查询来比较执行时间,然后交换并首先带上名称。要查看带有索引的 mysql 性能示例,请查看http://www.mysqlperformanceblog.com/2006/06/02/indexes-in-mysql/

于 2012-04-08T22:03:51.430 回答