没有网站可以做seo排名吗,网站建设小江网页设计,北京网站优化哪家好,做网站有骗子目录MySQL进阶存储引擎什么是存储引擎常用存储引擎事务什么是事务怎么理解提交事务 和回滚事务事务特性事务的隔离级别索引什么是索引索引的实现原理什么条件下#xff0c;我们会考虑给字段添加索引呢?什么条件下#xff0c;索引会失效#xff1f;索引分类MySQL进阶
存储引…
目录MySQL进阶存储引擎什么是存储引擎常用存储引擎事务什么是事务怎么理解提交事务 和回滚事务事务特性事务的隔离级别索引什么是索引索引的实现原理什么条件下我们会考虑给字段添加索引呢?什么条件下索引会失效索引分类MySQL进阶
存储引擎
什么是存储引擎
存储引擎是MysQL中特有的一个术语其它数据库中没有。(oracle中有但是不叫这个名字存储引擎这个名字
实际上存储引擎是一个表存储/组织数据的方式。
不同的存储引擎表存储数据的方式不同。
常用存储引擎 MyISAM存储引擎 它管理的表具有一下特征使用三个文件表示每张表
格式文件存储表结构的定义mytable.frm数据文件存储表行的内容mytable.MYD索引文件存储表中的索引mytable.MYI
该存储引擎的优势
可被转换为压缩、只读表节省空间 InnoDB存储引擎 这是mysql默认的存储引擎同时也是一个重量级的存储引擎。InnoDB支持事务支持数据库崩溃后自动恢复机制。
InnoDB存储引擎最主要的特点是非常安全
它管理的表具有下列主要特征
每个InnoDB表在数据库目录中以.frm格式文件表示InnoDB表空间tabiespace被用于存储表的内容提供一组用来记录事务性活动的日志文件COMMIT(提交)、SAVEPOINT及ROLLBACK(回滚)支持事务处理提供全ACID兼容在MysQL服务器崩溃后提供自动恢复多版本(Mvcc)和行级锁定支持外键及引用的完整性包括级联删除和更新
InnoDB和MyISAM二者的区别
InnoDB支持事务MyIASM不支持InnoDB安全MyISAM不安全InnoDB不能压缩数据文件不能节省空间InnoDB的效率不是很高 MEMORY存储引擎 使用MEMORY存储引擎的表其数据存储在内存中且行的长度固定这两个特点使得MEMORY 存储引擎非常快。
MEMORY存储引擎管理的表具有下列特征
在数据库目录内每个表均以.frm格式的文件表示。表数据及索引被存储在内存中。目的就是快查询快! )表级锁机制。不能包含TEXT或BLOB 字段。MEMORY 存储引擎以前被称为HEAP 引擎。
优势
基于内存存储数据效率高不安全断电即失
事务
什么是事务
一个事务就是一个完整的业务逻辑
怎么理解提交事务 和回滚事务
在事务的执行过程中每一条DML的操作都会记录到事务性活动的日志文件中。在事务的执行过程中我们可以提交事务也可以回滚事务。
提交事务
清空事务性活动的日志文件将数据全部彻底持久化到数据库表中。提交事务标志着事务的结束。并且是一种全部成功的结束。
回滚事务
将之前所有的DM操作全部撤销并且清空事务性活动的日志文件。回滚事务标志着事务的结束。并且是一种全部失败的结束。注意回滚事务意思是回滚到上个事务的提交点且mysql数据库是默认自动提交事务的
事务特性
A原子性事务为最小工作单元不可再分
C一致性在一个事务中多个数据库DML操作要么同时成功要么同时失败
I隔离性事物之间互不影响
D持久性事务结束将没有保存的数据持久化到磁盘
事务的隔离级别
读未提交read uncommitted–该事务能够读取其他事务未提交的数据
事务A可以读取到事务B未提交的薮据这种隔离级别存在的问题就是脏读
读已提交read committed–该事务只能读取其他事务已提交的数据
事务A只能读取到事务B提交之后的数据。这种隔离级别解决了脏读。存在的问题就是不可重复读 在事务开启之后第一次读到的数据是3条当前事务还没有结束可能第二次再读取的时候读到的数据是4条3不等于4称为不可重复读取。
可重复读repeatable read–该事务只能读取开启该事务时数据库那一时刻的数据 相当于“快照”《mysql默认的事务隔离级别》
事务A开启之后不管是多久每一次在事务A中读取到的数据都是一致的。即使事务B将数据已经修改并且提交了事务A读取到的数据还是没有发生改变这就是可重复读。这种隔离级别解决了不可重复读存在的问题幻读
序列化/串行化serializable
事务一个一个执行
索引
什么是索引
索引是在数据库表的字段上添加的是为了提高查询效率存在的一种机制一张表的一个字段可以添加一个索引当然多个字段联合起来也可以添加索引索引相当于一本书的目录是为了缩小扫描范围而存在的一种机制 对于一本字典来说查找某个汉字有两种方式 第一种方式一页一页挨着找直到找到为止这种查找方式属于全字典扫描效率比较低 第二种方式先通过目录索引去定位一个大概的位置然后直接定位到这个位置做局域性扫描缩小扫描的范围快速的查找。这种查找方式属于通过索引检索效率较高 注意
索引也是需要排序的索引排序的底层原理类似treeset的平衡二叉树
提醒
在任何数据库当中主键上都会自动添加索引对象 另外在mysql当中一个字段上如果有unique约束的话也会自动创建索引对象在任何数据库当中任何一张表的任何一条记录在硬盘存储上都有一个硬盘的物理存储编号在mysql当中索引是一个单独的对象不同的存储引擎以不同的形式存在在MyISAM存储引擎中索引存储在一个.MYT文件中。在InnoDB存储引擎中索引存储在一个逻辑名称叫做tablespace的当中。在MEMORY存储引擎当中索引被存储在内存当中
索引的实现原理 什么条件下我们会考虑给字段添加索引呢?
条件1数据量庞大到底有多么庞大算庞大这个需要测试因为每一个硬件环境不同)
条件2该字段经常出现在where的后面以条件的形式存在也就是说这个字段总是被扫描。条件3:该字段很少的DML(insert delete update)操作。因为DML之后索引需要重新排序。
建议不要随意添加索引因为索引也是需要维护的太多的话反而会降低系统的性能。
建议通过主键查询建议通过unique约束的字段进行查询效率是比较高的。
什么条件下索引会失效
select age from user where name like %T name上即使添加了索引,也不会走索引为什么?原因是因为模糊匹配当中以%开头了!使用or的时候会失效如果使用or那么要求or两边的条件字段都要有索引才会走索引如果其中一边有一个字段没有索引那么另一个字段上的索引也会实现。所以这就是为什么不建议使用or的原因。使用复合索引的时候,没有使用左侧的列可以是多个左侧的列查找索引失效什么是复合索引?两个字段或者更多的字段联合起来添加一个索引叫做复合索引。在where当中索引列参加了运算,索引失效。explain select * from emp where sal1 800 ;在where当中索引列使用了函数explain select * from emp where lower(ename) smith ;
索引分类
主键索引
唯一性索引
单一索引
组合复合索引