索引是建立在表上的,本质上是通过索引直接定位表的物理元组,加速数据获取的方式,所以索引优化应该归属到物理查询优化阶段。
1. 如何利用索引
通常查询优化器所使用索引的原则如下:
● 索隐裂座位条件出现在WHERE、HAVING、ON 子句中,这样有利于索引过滤元组;
● 索引列是被链接的表对象的列且存在于连接条件中;
● 还有一些情况可以使用索引,如排序操作、在索引列上球MIN、MAX等。
1.1 示例:
create table A(a1 int unique,a2 varchar(10),a3 int); (a1列上创建隐含索引)
● 对表做查询,没有列对象作为过滤条件(如出现在WHERE子句中),只能顺序扫描
mysql> explain extended select * from A;
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | A | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL |
+----+-------------+-------+------+---------------+------+---------+------+------+----------+-------+
type = ALL 表示 顺序扫描或范围扫描,不是用索引,顺序扫描,直接读取表上的数据(访问数据文件)。
● 对表做查询,有列对象列且索引列作为过滤条件,可作为索引扫描
mysql> explain extended select * from A where a1 >2;
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+-----------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+-----------------------+
| 1 | SIMPLE | A | range | a1 | a1 | 5 | NULL | 1 | 100.00 | Using index condition |
+----+-------------+-------+-------+---------------+------+---------+------+------+----------+-----------------------+
t ype = range 表示基于索引做范围扫描。Using index condition 表示尝试通过索引来获取
● 对表做查询,索引列被运算符“-” 处理,查询优化器不能再执行前进行取反操作,不可利用索引,只能顺序扫描。
select A.* from A where -A.a1 = -2; (不能利用索引)
select A.* from A where A.a1 = 2; (利用索引)
●对表做查询,选择条件不包括索引列,只能顺序扫描
select A.* from A where A.a3 = 2;
● 索引列参与了运算,不能使用索引
se