索引学习
前言
此文章记录学习mysql索引部分
提示:以下是本篇文章正文内容,下面案例可供参考
一、索引是什么
索引是一种排列好的数据结构,也是文件,和数据表一样,存储在磁盘中,索引对于数据表而言,就像是一本书的目录,能够更加快速的找到你想找到数据的位置;使用索引只有一个目的就是快!(查询的快),索引的作用:约束 和 加速查找;
二、索引的分类
1.普通索引(NORMAL)
-
创建索引
-
指令创建
create index 索引名称 on 表名(列名(int 截取字符个数))
-
使用 alter 修改 创建
-
alter table 表名 add index 索引名称( 列名 )
普通索引 只有加快查找作用
2.主键索引(PRIMARY KEY)
-
创建索引
-
创建数据表时创建
create table test(id int not null primary key auto_increment ,name var(16) not null);
-
使用 alter 修改 创建
-
alter table 表名 add primary key (列名)
-
主键索引 加快查找 不能为空 不能重复
3.唯一索引(UNIQUE)
-
创建索引
-
指令创建
-
create unique index 索引名称 on 表名(列名(int 截取字符个数))
-
使用 alter 修改 创建
-
alter table 表名 add unique (列名)
唯一索引 加快查找 不能重复
4.组合索引
5.全文索引(FULLTEXT)
- 仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时好空间。
- Innodb不要用全文索引
三.索引种类
1.hash索引
hash 的索引会把你指定的列重新再生成一个hash值的表,无序的;
优缺点:
查询单值比较快
范围查找比较慢
2.btree索引
二叉树 ;排列的结构 ,左边的比右边的值小,呈金字塔的形式呈现;
单值查找都比较快
范围查找都比较快
你是用innodb引擎 是默认就是 btree;
三.索引无法命中情况
id int 有索引(主键索引) ;name var (20) 没有索引;bio 有索引 var(20)普通索引;
-
LIKE ‘% xx’
使用like 时,不走索引,会直接到数据表里查找;
数据多的时候一般不会使用LIKE,一般都会用第三方工具,进行全文索引; -
使用函数
比如 :reverse() -
or 的使用 可能出现不走索引的时候
特别是:当查询条件的列没有建索引的时候就会失效select * from test where id = 12 or where name =‘小明’;
这样就就不会走id索引 -
数据类型不一致
select * from test where bio = 123;
此时就不会走索引 -
!=
select * from test where bio != ‘123’;
此时就不会走索引
特殊的:如果是主键,也就是主键索引还是会走索引; -
大于 >
使用大于号时会不走索引
但是当时是主键索引 或者 数据是 int 整数 还是会走索引 -
order by
select * from test order by bio desc;
此时不走索引
select bio from test order by bio desc;
这样才会走索引
select * from test order by id desc;
但是主键的时候 还是走索引; -
组合索引的最左前缀
-
小总结
上面都是特殊的情况,都需要记下来;开发的事后要根据业务逻辑来创建索引,索引不是建的越多越好,建索引查询会变得快,但是插入,修改,删除 都会变得比以前慢,数据表添加一条,索引文件也需要添加一条记录,修改删除都会维护索引;
四.注意事项
- 尽量避免使用 select *
- count(1)代替 count(*)
- 创建表var 代替varchar
- 尽量使用短索引,是指的存储数据比较短列创建索引,如果索引字符太长,创建时可能会出问题;
- 联表的时候 数据类型一致;
- 数值重复多的不合适建索引,列如 :男 女 1 ,2 重复性很高 ,就不适合建索引
总结
以上基础,需要记住,有问题请留言