建设工程国检中心网站,东莞公司网站价格,深圳网页服务开发与网站建设,中药材初加工平台索引的基本原理
把无需的数据变成有序的查询
1#xff0c;把创建了索引的列的内容进行排序
2#xff0c;对排序结果生成倒排表
3#xff0c;到倒排表内容上拼上数据地址链
4#xff0c;在查询的时候#xff0c;先拿到倒排表内容#xff0c;再取出数据地址链#xf…索引的基本原理
把无需的数据变成有序的查询
1把创建了索引的列的内容进行排序
2对排序结果生成倒排表
3到倒排表内容上拼上数据地址链
4在查询的时候先拿到倒排表内容再取出数据地址链从而拿到具体数据
mysql聚簇和非聚簇索引的区别
都是B树的数据结构
聚簇索引将数据存储与索引放到了一块并且时按照一定的顺序组织的找到索引就是找到数
据数据的物理存放顺序与索引顺序时一致的即索引是相邻的那么对应的数据一定的也是相
邻地放在磁盘上的
非聚簇索引叶子节点不存储数据存储的是数据行地址也就是说根据索引查找到数据行的位置
再取磁盘查找数据类似一本书的目录比如要查找第一章第一节那么我们先在这个目录里面
找找到对于的页码再去对应的页码查看文章
InnoDB中一定有主键主键一定是聚簇索引不手动设置则会使用unique索引没有unique索
引则会使用数据库内部的一个行的隐藏id来当作主键索引在聚簇索引之上创建的索引称之为辅
助索引辅助索引访问数据总是需要二次查找非聚簇索引都是辅助索引像复合索引前缀索
引唯一索引辅助索引叶子节点存储的不再是行的物理位置而是主键值 MyISAM使用的是非聚簇索引没有聚簇索引非聚簇索引的两颗B树看上去没什么不同节点的
结构完全一致只是存储的内容不同主键索引B树的节点存储了主键辅助索引B树存储了辅
助建表数据存储在独立的地方这两颗B树的叶子节点都是用一个地址只想真正的表数据对
于表数据来说这两个键没有任何区别由于索引树是独立的通过辅助键检索无需访问主键的索引树。
但是涉及到大数据量的排序全表扫描count之类的操作还是MyISAM占优因为索引所占空
间小因为这些操作是需要在内存中完成的。
MySQL索引的数据结构各自的优劣
简介
索引的数据结构和具体存储引擎的实现有关在MySQL中使用较多的索引为Hash索引B树索引等InnoDB存储引擎的默认实现为B树索引对于哈希索引来说底层的数据结构就是哈希表因此在绝大部分需求为单挑记录查询的时候可以选择哈希索引查询性能最快其余大部分场景建议选择BTree索引
B树
B树是一个平衡的多叉树从根节点到每个叶子节点的高度差值不超过一而且同层级的节点间有指针相互链接在B 树上的常规检索从根节点到叶子节点的搜索效率基本相当不会出现大幅波动而且基于索引的顺序扫描时也可以利用双向指针快速左右移动了效率非常高B树索引也被广泛应用于数据库文件系统 哈希索引
采取一定的哈希算法把键值换算成新的哈希值检索式不需要类似B树从根节点到叶子节点
逐级查找只需要一次哈希算法就可立刻定位到相应的位置速度很快在等值查询上哈希索引
有绝对优势经过一次算法就能找到对应的键值前提键值唯一不唯一就得查找键所在地址然后根据链表往后扫描直到找到对应的数据
不支持范围查询搜索因为有序的键值经过哈希之后就会变得不连续不能再利用索引进行范围查询检索
也没办法利用索引完成排序以及部分模糊查询like xxx%
不支持多列联合索引的最左匹配机制
大量重复键值情况下哈希效率极低会存在哈希碰撞
索引设计的原则
查询更快占用空间更小等主体业务功能开发完毕把涉及到该表相关sql都要拿出来分析之后再建立索引。
1、联合索引尽量覆盖条件
比如可以设计一个或者两三个联合索引(尽量少建单值索引)让每一个联合索引都尽量去包含sql语句里的
where、order by、group by的字段还要确保这些联合索引的字段顺序尽量满足sql查询的最左前缀原则。
2、不要在小基数字段上建立索引
索引基数是指这个字段在表里总共有多少个不同的值比如
一张表总共100万行记录其中有个性别字段
其值不是男就是女那么该字段的基数就是2。 3、长字符串我们可以采用前缀索引
尽量对字段类型较小的列设计索引比如说什么tiny int之类的。
4、where与order by冲突时优先where
5、基于慢sql查询做优化
6、更新频繁的不适合做索引
7、定义有外键的数据列一定建立索引
MySQL锁的分类
基于锁的属性分类共享锁排他锁
基于锁的粒度分类行级锁表级锁页级锁记录锁间隙锁临键锁
基于锁的状态分类意向共享锁意向排它锁
共享锁(Share Lock)
又称读锁S锁一个事务为数据加上读锁之后其他事务之对该数据加读锁不能加写锁直到所
有读锁释放才能进行加持写锁它的特性就是为了支持并发的读取数据读取数据的时候不支持修改避免重复读
排他锁(ExClusive Lock)
又称写锁X锁一个事务为数据加上写锁时其他请求就不能为数据加任何锁直到该锁释放之
后其他事务才能对数据加锁它的目的就是在数据修改时其他人不能同时修改也不能读取避免脏数据和脏读的问题
表锁(Table Lock)
指上锁的时候锁住的是整个表当下一个事务访问该表的时候必须等前一个事务释放了锁才能进行对表访问特点力度大加锁简单容易冲突
行锁()
指上锁的时候锁住的是表的某一行数据或多行记录其他事务访问同一张表的时只有被锁住的记录不能访问其他记录可正常访问。
特点粒度小加锁比表锁麻烦不容易冲突相比表锁支持的并发要高、
记录锁(Record Lock)
属于行锁的一种记录锁的范围只是表的某一条记录事务在枷锁后所住的只是表的某一条记录
避免数据在被查询时被修改的重复读问题和在修改的事务未提交钱被其他事务读取的脏读问题
页锁
MySQL中锁定颗粒介于行级锁和表级锁中间的锁取了折中的页级一次锁定相邻的一组记录
特点开锁和加锁时间介于表锁和行锁之间会出现死锁并发度一般
间隙锁(Gap Lock)
行锁的一种在事务枷锁后锁住的时表记录的某一个区间当表的相邻id之间出现空隙则会形成一
个区间遵循左开右闭原则只会出现在REPEATABLE READ(重复读)的事务级别中没有间隙锁则会出现同一事务两次查询结构不同
临建锁(Next-Key Locks)
锁住某条记录 又想阻止其他事务在该记录前边的间隙插入新记录 Next-Key Locks是在存储引
擎innodb 、事务级别在可重复读的情况下使用的数据库锁,避免在范围查询时出现脏读重复读
幻读问题加锁后范围区间内数据不允许被修改和插入
意向共享锁
事务试图对整个表进行加共享锁之前首先要获得这个表的意向共享锁
意向排他锁
事务试图对整个表进行加排他锁之前首先要获得这个表的意向排他锁