索引index,是一种有序的数据结构,可以高效的获取数据,在数据库中维护着满足查找特定算法的数据结构,就是索引
无索引的情况,查询数据时会全表扫描,效率极低
索引结构
(1)二叉树,查询性能还行,但当数据顺序插入时,就会形成链表,数据量大时,层级就深,查询效率慢
(2)红黑树,是普通二叉树优化,但本质仍是二叉树,不适合大数据情况
(3)BTree,即多路平衡查找树,该树一个节点下可以挂多个节点,以一个5阶的树,他的每个节点底下可以挂5个子节点,每个节点最多存储4个key,5个指针。节点中超过了4个key,就会向上分裂。
(4)B+Tree,以4阶的树为例,所有的元素都会出现在叶子节点,上面的节点不存放数据,且叶子节点形成了单项链表、
在mysql中的B+Tree中,对普通的树进行了优化,即叶子节点形成的不再是单向链表,而是双向链表
(5)Hash用一定的hash算法,算出对应的hash值,映射到对应的位置上,然后存储在hash表中
多个key计算的hash值有可能重复,可以通过链表来解决(类似HashMap)
Hash只能用于对等比较,不能范围查询,也不能排序,因为查询结果无序,但查询效率高,通常只需要查询一次,有时候遇到hash碰撞要多查询
索引的分类
(1)主键索引PRIMARY
(2)唯一索引UNIQUE
(3)常规索引
(4)全文索引FULLTEXT
innoDB中,索引按存储形式又分为聚集索引和二级索引
聚集索引就是叶子节点下挂的是这一行的行数据,而二级索引的叶子节点下挂的是表的主键,还要通过主键再次索引
如果表有主键,主键索引就是聚集索引
不存在主键,将使用第一个unique索引作为聚集索引
上述都不存在,则会自动生成一个rowid作为聚集索引
索引的语法
(1)查看对应表的索引 show index from 表名;
(2)创建索引 create [ PRIMARY/UNIQUE/FULLTEXT] index 索引名 on 表名;
索引名一般这样取:idx_
--------------------------
索引性能优化
性能的优化主要是优化查询语句,所以怎么才能知道什么表中的查询较多呢?
(1)根据show [session / global] status like 'Com__9_____';可以访问CRUD的访问频次
(2)查看慢查询日志
所有执行时间超过参数long_query_time的查询都会被记录在慢查询日志,默认下慢查询日志未开启
(3)profile
数据库支持profile的话可以使用,可以使用select @@have_profiling查看是否支持
profiling默认为关闭,需要set profiling = 1打开开关
show proflies能够帮我们查看sql优化中,时间都花在了哪里
(4)explain执行计划
前三种方法都只是在时间上判断sql语句性能,而explain或desc可以获取如何执行select的信息,包括在执行中表如何连接,和连接的顺序情况
explain执行计划中,各个字段的含义:
id:select查询的序列号,表示查询中执行select字句或是操作表的顺序,当id相同时,执行顺序从上到下,id不同,则id越大,越先执行。
select_type:表示select的类型,一般有primary(主查询,即外层查询),simple(不使用表连接或子查询),union(union中的第二个或之后的查询语句),subquery(子查询)
type:表示连接类型,性能由好到差的连接类型为:null(不使用任何表),system(访问了系统表),const(使用主键或唯一索引访问),eq_ref,ref(使用非唯一索引),range(范围查询),index,all,优化sql时尽量往前优化。
possible_keys:可能应用到这张表上的索引
keys:实际使用的索引,无则为null
key_len:索引使用的字节数,一般来说长度越短越好
rows:mysql认为必须要执行查询的行数,是一个估计值
filtered:返回结果的行数占需读取行数的百分比,越大越好
extra:额外展示的信息