假设我有这张表:
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子句了吗?
答案 0 :(得分:2)
由于id是PK(并且名称上没有索引),它将把满足基于id的标准的所有行加载到内存中,之后它将按名称标准过滤结果集。添加包含两个字段的复合索引意味着它只会加载满足这两个条件的记录。在name字段上添加单独的单列索引可能不会导致索引合并操作,在这种情况下索引将不起作用。
答案 1 :(得分:0)
你们两列都有索引吗?这可能会影响执行计划。另一件事是可能会强制使用'x':: int来确保数字比较,而不是字符串比较。
答案 2 :(得分:0)
为了获得最佳结果,您应该拥有一个包含列id和名称的索引。
在您的情况下,我无法回答主索引对该查询的影响。这取决于DBMS和版本。如果你真的不想放更多索引(因为更多索引意味着写入和更新速度慢)只需用10.000.000随机结果填充你的表,试试看效果。
答案 3 :(得分:0)
您可以通过在查询上运行EXPLAIN
来获取有关如何处理查询的信息。
如果想要优化该查询,那么您可能希望添加如下索引:
alter table table_a add unique index name_id_idx (name, id);
答案 4 :(得分:0)
您可以通过在where子句中首先执行id时首先执行查询来比较执行时间,然后交换并将名称放在第一位。要查看带索引的mysql性能示例,请查看http://www.mysqlperformanceblog.com/2006/06/02/indexes-in-mysql/