为什么有时候在 MySQL 中查询不用索引更快(mysql 不用索引)
为什么有时候在 MySQL 中查询不用索引更快?
MySQL 是目前最流行的关系型数据库管理系统之一,通过使用索引,可以提高查询效率。然而,在实际应用中,有时候查询不用索引反而更快,这是为什么呢?
1. 查询结果集太小
如果一个表只有几十行,即使没有索引,查询速度也会很快。在这种情况下,不使用索引反而会节省一些查询时间,因为不用消耗时间去查找索引。
例如,对于以下测试表(test_table),共有 1000 行数据:
CREATE TABLE test_table (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
当只查询 10 行数据时(age
SELECT * FROM test_table WHERE age
SELECT * FROM test_table WHERE age
两者的查询时间几乎相同。
2. 索引字段不是 WHERE 查询条件中第一个字段
这种情况下,查询语句需要先查找索引,然后才能确定 WHERE 查询条件。如果索引字段不是查询条件中的第一个字段,那么查询就需要多次访问磁盘,导致查询效率降低。
例如,对于以下测试表(test_table2),共有 10 万行数据:
CREATE TABLE test_table2 (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL,
sex VARCHAR(2) NOT NULL
);
当使用 name 作为查询条件时,使用索引和不使用索引的查询效率如下:
SELECT * FROM test_table2 WHERE name = ‘张三’ AND age = 20 AND sex = ‘男’; — 不使用索引,查询时间:2.283s
SELECT * FROM test_table2 WHERE name = ‘张三’ AND age = 20 AND sex = ‘男’; — 使用索引,查询时间:2.710s
可以发现,使用索引查询的效率要比不使用索引查询的效率慢。
3. 数据分布情况不均匀
如果一个表中的数据分布很不均匀,那么使用索引查询的效率反而会降低。
例如,对于以下测试表(test_table3),共有 1000 行数据:
CREATE TABLE test_table3 (
id INT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INT NOT NULL
);
其中,age 的取值范围为 1~1000,但是,1000 行数据中,age=1 的记录有 500 行,而其他值的记录只有 1 行。
当查询 age=1 的记录时,使用索引和不使用索引的查询效率如下:
SELECT * FROM test_table3 WHERE age = 1; — 不使用索引,查询时间:0.001s
SELECT * FROM test_table3 WHERE age = 1; — 使用索引,查询时间:0.003s
可以发现,在这种情况下,使用索引查询的效率反而比不使用索引查询的效率慢。
综上所述,有时候在 MySQL 中查询不用索引反而更快,其中的原因主要有三个:查询结果集太小、索引字段不是 WHERE 查询条件中第一个字段、数据分布情况不均匀。因此,在实际应用中,我们需要根据具体情况来选择是否使用索引。