SQL索引

https://v.youku.com/v_show/id_XNDMzMTI2MzA3Ng==.html?spm=a2h0j.11185381.listitem_page1.5!8~A
数据库索引:按照用户任意指定的字段对数据进行排序的一种数据结构
会用到哪些数据结构?
hash、 avl tree(完全平衡二叉树)、B+ tree
数据和页目录,页目录中会保存数据中最小的,数据是按照链表存的,我们没有建立主键的时候,会看有没有唯一索引,如果都没有也会自动新增一个隐藏字段rowid
主键索引(默认的)
SQL索引_第1张图片
这样画就更好理解了,可以感觉全表扫描是从左往右进行,如果走索引,那么就是从上往下
SQL索引_第2张图片SQL索引_第3张图片
联合索引根据其他字段建立索引图中 222,就是数据库字段中BCD的值 b=2 c=2
这里是int类型的,下面的就是主键的索引,然后在根据上面的主键索引找(回表)
每次给字段建一个新索引, 字段中的数据就会被复制一份出来, 用于生成索引。 因此, 给表添加索引,会增加表的体积, 占用磁盘存储空间。

非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据
不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。
SQL索引_第4张图片
那么字符串呐?按照字符集,但是一般用字符串做索引的比较少
回到数字索引,表中有多列,其中有b,c,d,假设我们建立关于bcd的联合索引,跟上图一样。
当我们执行select * from table where b = 1,c=1,d=1;这样可定会走索引的
当我们执行select * from table where b = 1;这样也会走,因为这样相当于1**
当我们执行select * from table where c=1;这样不会走索引,相当于*1 *没有办法匹配
这就是最左前缀原则,跟like字段一样“123%”这样就可能走索引,“%123”这样就不会
cookies
select 0 = ‘a’返回1
因为mysql中字符会转成0 而且自会把字符转换成数字
列e是字符串
select * from table where e = 3;这样子不走索引,数字不会转成字符串,而且索引中的数据都是字符串类型,不能改变B+树的结构

select * from table

这样肯定是全表扫描

select b from table;走辅助索引就是联合索引,因为页数可能要少一点,IO更快一点
select b from table order by b,c,d;已经排好序了,可以直接利用索引
select * from table order by b,c,d;需要回表,效率不确定,所以不走索引全表扫描

你可能感兴趣的:(数据库)