今日内容:1. 索引

作用:-约束-加速查找

索引:- 主键索引:加速查找 + 不能为空 +不能重复-普通索引:加速查找- 唯一索引:加速查找 +不能重复-联合索引(多列):-联合主键索引-联合唯一索引-联合普通索引

加速查找:

快:

select* from tb where name='asdf'select* from tb where id=999假设:
id name email
...
...
..

无索引:从前到后依次查找

索引:

id 创建额外文件(某种格式存储)

name 创建额外文件(某种格式存储)

email 创建额外文件(某种格式存储) create index ix_name on userinfo3(email);

name email 创建额外文件(某种格式存储)

mysql索引种类(某种格式存储):

hash索引(不连续的查找会快):

单值快

范围

btree索引(默认): btree索引(连续的查找会快)

二叉树========》 结果:快 《========建立索引:-a. 额外的文件保存特殊的数据结构、-b. 查询快;插入更新删除慢-c. 命中索引

select* from userinfo3 where email='asdf';
select* from userinfo3 where email like 'asdf'; 慢
...

主键索引:

普通索引:-create index 索引名称 on 表名(列名,)-drop index 索引名称 on 表名

唯一索引:-create unique index 索引名称 on 表名(列名)-drop unique index 索引名称 on 表名

组合索引(最左前缀匹配):-create unique index 索引名称 on 表名(列名,列名)-drop unique index 索引名称 on 表名-create index ix_name_email on userinfo3(name,email,)-最左前缀匹配

select* from userinfo3 where name='alex'; 走索引

select* from userinfo3 where name='alex' and email='asdf'; 走索引

select* from userinfo3 where email='alex@qq.com'; 不走索引

组合索引效率>索引合并

组合索引-(name,email,)

select* from userinfo3 where name='alex' and email='asdf';

select* from userinfo3 where name='alex';

索引合并:-name-email

select* from userinfo3 where name='alex' and email='asdf';

select* from userinfo3 where name='alex';

select* from userinfo3 where email='alex';

名词:

覆盖索引:-在索引文件中直接获取数据

索引合并:-把多个单列索引合并使用2. 频繁查找的列创建索引-创建索引- 命中索引 *****创建索引而又没有命中索引的情况有以下几种::- like '%xx' -like不要用(如果数据量比较大的时候)

select* from tb1 where email like '%cn';-使用函数(使用函数也会不走索引,可以在python中实现)

select* from tb1 where reverse(email) = 'wupeiqi';- or(or右边的不是索引的情况下,不走索引)

select* from tb1 where nid = 1 or name = 'seven@live.com';

特别的:当or条件中有未建立索引的列才失效,以下会走索引

select* from tb1 where nid = 1 or name = 'seven';

select* from tb1 where nid = 1 or name = 'seven@live.com' and email = 'alex'

-类型不一致(不走索引)

如果列是字符串类型,传入条件是必须用引号引起来,不然...

select* from tb1 where email = 999;- !=(不走索引,主键除外)

select* from tb1 where email != 'alex'特别的:如果是主键,则还是会走索引

select* from tb1 where nid != 123

- >select* from tb1 where email > 'alex'特别的:如果是主键或索引是整数类型,则还是会走索引

select* from tb1 where nid > 123select* from tb1 where num > 123

-order by

select namefromtb1 order by email desc;

当根据索引排序时候,选择的映射如果不是索引,则不走索引

特别的:如果对主键排序,则还是走索引:

select* fromtb1 order by nid desc;-组合索引最左前缀

如果组合索引为:(name,email)

nameand email --使用索引

name--使用索引

email--不使用索引

其他注意事项

避免使用select*

- count(1)或count(列) 代替 count(*)-创建表时尽量时 char 代替 varchar

索引散列值(重复少)不适合建索引,例:性别不适合