1.概述
索引是存储引擎用于快速查找记录的一种数据结构,通过合理的使用数据库索引可以大大提高系统的访问性能,接下来主要介绍在MySql数据库中索引类型,以及如何创建出更加合理且高效的索引技巧。
注:这里主要针对的是InnoDB存储引擎的B+Tree索引数据结构
2.索引的优点
1、大大减轻了服务器需要扫描的数据量,从而提高了数据的检索速度
2、帮助服务器避免排序和临时表
3、可以将随机I/O变为顺序I/O
3.索引的创建
3.1、主键索引
ALTER TABLE 'table_name' ADD PRIMARY KEY 'index_name' ('column');
3.2、唯一索引
ALTER TABLE 'table_name' ADD UNIQUE 'index_name' ('column');
3.3、普通索引
ALTER TABLE 'table_name' ADD INDEX 'index_name' ('column');
3.4、全文索引
ALTER TABLE 'table_name' ADD FULLTEXT 'index_name' ('column');
3.5、组合索引
ALTER TABLE 'table_name' ADD INDEX 'index_name' ('column1', 'column2', ...);
4.B+树的索引规则
创建一个测试的用户表
DROP TABLE IF EXISTS user_test; CREATE TABLE user_test( id int AUTO_INCREMENT PRIMARY KEY, user_name varchar(30) NOT NULL, sex bit(1) NOT NULL DEFAULT b'1', city varchar(50) NOT NULL, age int NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建一个组合索引:
ALTER TABLE user_test ADD INDEX idx_user(user_name , city , age);
4.1、索引有效的查询
4.1.1、全值匹配
全值匹配指的是和索引中的所有列进行匹配,如:以上面创建的索引为例,在where条件后可同时查询(user_name,city,age)为条件的数据。
注:与where后查询条件的顺序无关,这里是很多同学容易误解的一个地方
SELECT * FROM user_test WHERE user_name = 'feinik' AND age = 26 AND city = '广州';
4.1.2、匹配最左前缀
匹配最左前缀是指优先匹配最左索引列,如:上面创建的索引可用于查询条件为:(user_name )、(user_name, city)、(user_name , city , age)
注:满足最左前缀查询条件的顺序与索引列的顺序无关,如:(city, user_name)、(age, city, user_name)
4.1.3、匹配列前缀
指匹配列值的开头部分,如:查询用户名以feinik开头的所有用户
SELECT * FROM user_test WHERE user_name LIKE 'feinik%';
4.1.4、匹配范围值
如:查询用户名以feinik开头的所有用户,这里使用了索引的第一列
SELECT * FROM user_test WHERE user_name LIKE 'feinik%';
4.2、索引的限制
1、where查询条件中不包含索引列中的最左索引列,则无法使用到索引查询,如:
SELECT * FROM user_test WHERE city = '广州';
或
SELECT * FROM user_test WHERE age= 26;
或
SELECT * FROM user_test WHERE city = '广州' AND age = '26';
2、即使where的查询条件是最左索引列,也无法使用索引查询用户名以feinik结尾的用户
SELECT * FROM user_test WHERE user_name like '%feinik';
3、如果where查询条件中有某个列的范围查询,则其右边的所有列都无法使用索引优化查询,如:
SELECT * FROM user_test WHERE user_name = 'feinik' AND city LIKE '广州%' AND age = 26;