-- 建表时创建唯一索引:
CREATE TABLE t_user2 (
id VARCHAR(20) PRIMARY KEY,
name VARCHAR(20),
UNIQUE(name)
);
-- 建表后创建唯一索引:
CREATE UNIQUE INDEX name_index ON t_user2(name);
AI写代码sql
123456789
3.4 复合索引创建
sql复制代码
-- 建表时创建复合索引:
CREATE TABLE t_user3 (
id VARCHAR(20) PRIMARY KEY,
name VARCHAR(20),
age INT,
KEY(name,age)
);
-- 建表后创建复合索引:
CREATE INDEX name_age_index ON t_user3(name,age);
-- 复合索引查询的2个原则
-- 1.最左前缀原则
-- eg: 创建复合索引时,字段的顺序为 name,age,birthday
-- 在查询时能利用上索引的查询条件为:
SELECT * FROM t_user3 WHERE name = ?
SELECT * FROM t_user3 WHERE name = ? AND age = ?
SELECT * FROM t_user3 WHERE name = ? AND birthday = ?
SELECT * FROM t_user3 WHERE name = ? AND age = ? AND birthday = ?
-- 而其他顺序则不满足最左前缀原则:
... WHERE name = ? AND birthday = ? AND age = ? -- 不满足最左前缀原则
... WHERE name = ? AND birthday = ? -- 不满足最左前缀原则
... WHERE birthday = ? AND age = ? AND name = ? -- 不满足最左前缀原则
... WHERE age = ? AND birthday = ? -- 不满足最左前缀原则
-- 2.MySQL 引擎在执行查询时,为了更好地利用索引,在查询过程中会动态调整查询字段的顺序!
-- 这时候再来看上面不满足最左前缀原则的四种情况:
-- 不满足最左前缀原则,但经过动态调整顺序后,变为:name age birthday 可以利用复合索引!
... WHERE name = ? AND birthday = ? AND age = ?
-- 不满足最左前缀原则,也不能动态调整(因为缺少age字段),不可以利用复合索引!
... WHERE name = ? AND birthday = ?
-- 不满足最左前缀原则,但经过动态调整顺序后,变为:name age birthday 可以利用复合索引!
... WHERE birthday = ? AND age = ? AND name = ?
-- 不满足最左前缀原则,也不能动态调整(因为缺少name字段),不可以利用复合索引!
... WHERE age = ? AND birthday = ?
AI写代码sql
123456789101112131415161718192021222324252627282930313233343536
4. MySQL索引的数据结构(B+Tree)
sql复制代码
-- 建表:
CREATE TABLE t_emp(
id INT PRIMARY KEY,
name VARCHAR(20),
age INT
);
-- 插入数据:插入时,主键无序
INSERT INTO t_emp VALUES(5,'d',22);
INSERT INTO t_emp VALUES(6,'d',22);
INSERT INTO t_emp VALUES(7,'3',21);
INSERT INTO t_emp VALUES(1,'a',23);
INSERT INTO t_emp VALUES(2,'b',26);
INSERT INTO t_emp VALUES(3,'c',27);
INSERT INTO t_emp VALUES(4,'a',32);
INSERT INTO t_emp VALUES(8,'f',53);
INSERT INTO t_emp VALUES(9,'b',13);
-- 查询:自动排序,有序展示(因为主键是有主键索引的,因此会自动排序)
AI写代码sql
12345678910111213141516171819
问题:为什么数据插入时,未按照主键顺序,而查询时却是有序的呢?
原因:MySQL底层为主键自动创建索引,一旦创建了索引,就会进行排序!
实际上这些数据在MySQL底层的真正存储结构变成了下面这种方式:
问题:为什么要排序呢?
因为排序之后查询效率就快了,比如查询 id = 3 的数据,只需要按照顺序去找即可,而如果不排序,就如同大海捞针,假如100W条数据,可能有时候需要随机查询100W次才找到这个数据,也可能运气好上来第1次就查询到了该数据,不确定性太高!
-- 1. 查询语句中使用LIKE关键字:(这种情况主要是针对于单列索引)
-- 在使用LIKE关键字查询时,如果匹配字符串的第一个字符为'%',则索引不会被使用,而'%'不在最左边,而是在右边,则索引会被使用到!
-- eg:
SELECT * FROM t_user WHERE name LIKE 'xx%' -- 可以利用上索引,这种情况下可以拿xx到索引树上去匹配
SELECT * FROM t_user WHERE name LIKE '%xx%' -- 不可以利用上索引
SELECT * FROM t_user WHERE name LIKE '%xx' -- 不可以利用上索引
-- 2. 查询语句中使用多列索引:(这种情况主要是针对于聚合索引)
-- 多索引是在表的多个字段创建索引,只有查询条件中使用了这些字段中的第一个字段,索引才会被使用。即:最左前缀原则,详情查看3.4小结聚合索引中的介绍!
-- 3. 查询语句中使用OR关键字:
-- 查询条件中有OR关键字时,如果OR前后的两个条件列都具有索引,则查询中索引将被使用,而如果OR前后有一个或2个列不具有索引,那么查询中索引将不被使用到!
AI写代码sql
123456789101112