我正在学习数据库的索引。
这是表格的索引。这张表有330k的记录。
mysql> show index from employee;
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| employee | 0 | PRIMARY | 1 | id | A | 297383 | NULL | NULL | | BTREE | | | YES | NULL |
| employee | 0 | ak_employee | 1 | personal_code | A | 297383 | NULL | NULL | | BTREE | | | YES | NULL |
| employee | 1 | idx_email | 1 | email | A | 297383 | NULL | NULL | | BTREE | | | YES | NULL |
+----------+------------+-------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
如您所见,此表上只有三个索引。
现在我想查询birth_date
列的哪个位置,我认为它会非常慢,因为birth-date
列上没有索引,当我尝试查询时,我发现它非常快。
mysql> select sql_no_cache *
-> from employee
-> where birth_date > '1955-11-11'
-> limit 100
-> ;
100 rows in set, 1 warning (0.04 sec)
所以我很困惑:
这是您的查询:
select sql_no_cache *
from employee
where birth_date > '1955-11-11'
limit 100
没有索引,因此查询开始从数据页读取数据。在每条记录上,它比较birthdate并返回该行。当它找到100(由于limit
)它停止。
据推测,它很快找到了100行。毕竟,美国的中位年龄大约是38岁 - 这是(正如我所写的)1981年的出生年份。到目前为止,大多数人出生于1955年之后。
如果您有order by
或group by
,查询会慢得多。这将需要在返回任何内容之前读取所有数据。