如何理解并正确使用MySql索引

xiaoxiao2021-02-28  73

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+Tree的索引规则 创建一个测试的用户表

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 '
转载请注明原文地址: https://www.6miu.com/read-65956.html

最新回复(0)