重庆企业网站建设,企业展示型网站有哪些,2015网站建设,天津网站制作套餐文章目录 一、索引二、事务 一、索引 数据库中的表、数据、索引之间的关系#xff0c;类似于书架上的图书、书籍内容和书籍目录的关系 1. 概述
概念#xff1a;相当于是一本书的目录#xff0c;是以‘列’为维度进行建立的使用场景#xff1a;如果我们要查询一个表中的某个… 文章目录 一、索引二、事务 一、索引 数据库中的表、数据、索引之间的关系类似于书架上的图书、书籍内容和书籍目录的关系 1. 概述
概念相当于是一本书的目录是以‘列’为维度进行建立的使用场景如果我们要查询一个表中的某个数据可以通过遍历来实现但那样速度太慢可以通过给这个表建立索引来提高查找的速度使用讲解 按照id这列建立索引效果是在数据库上额外搞了一个空间用来维护一些和id相关的信息即id为1在哪个位置id为2在哪个位置参考目录。后续按照id查找的时候就不必直接遍历了而是从索引中进行查询根据索引就能初步锁定数据所在的位置注意这个索引中只能按照id来查询按照name来查询不能提高效率需要给name也建立一个索引才行 作用 优点提高查询效率缺点 1消耗额外的磁盘空间 2可能会拖慢增删改的速度因为新增不光要往表里写数据还要增加索引。如果是删和改如果删或改的条件正好是和索引匹配的速度能快点但是如果涉及到了索引列的删除/修改就需要同时维护索引就会很慢
2. 使用 创建主键约束PRIMARY KEY、唯一约束UNIQUE、外键约束FOREIGN KEY时会自动创建对应列的索引。因为主键不允许重复进行插入或修改就需要先查询看是否重复 查看索引show index from 表名; 创建索引create index 索引名 on 表名(字段名); 对于非主键、非唯一约束、非外键的字段可以创建普通索引注意这个操作可能会很危险 如果表是空的或者表里包含的数据本身就不多那可以创建。但是如果表非空并且里面包含了非常多的数据创建索引就会引起非常大规模的硬盘IO操作进一步就会导致数据库被卡死。这就相当于要整理全部的数据。所以需要提前考虑好在设计表的阶段哪些列要索引 删除索引drop index 索引名 on 表名; 删除索引只能针对手动创建的索引自动生成的索引是不能被删除的这个操作也十分危险原因参考创建 如果就是要给一个有着非常多数据的表删除/创建索引 准备一个新的mysql服务器把表和索引都创建好然后把数据都导入过来再把要替换的mysql服务器关闭最后把新的mysql服务器替换上去就行了上述操作的原因数据库服务器往往也不是单台服务器为了整个系统的可靠性通常会搞多个mysql服务器节点这些节点的数据都是一样的能够提供相同的服务彼此之间相互独立其中一个挂了也不影响整体 关于if、while等语法 sql中不建议使用一些其他支持的语法如条件、循环等因为该语法较老且sql写得复杂不方便调试和优化实际开发中去表示这样的更复杂的逻辑往往是使用其他语言增删改查的方式
3. 底层的数据结构 其实在物理层面上不需要‘表格’这样的数据结构直接使用B树来存储这个表的数据“表格”只是让用户看起来这像个表格而已 1.概念 mysql的索引的数据结构是什么样的取决于mysql使用哪个存储引擎 位置 数据库的数据结构是在硬盘上的内存上的数据结构对于访问操作来说是不敏感的找数据的过程花费时间多真正访问的操作时间则不多硬盘上的数据结构对于访问操作来说是比较敏感的读写一次硬盘开销远远大于内存读写一次硬盘相当于读写1w次内存大约的约束内存和内存硬盘和硬盘之间彼此差异很大 存储引擎 mysql这个程序中包含很多模块有负责解析sql的有负责网络通信的有负责存储数据的……负责存储数据的就是存储引擎本质上就是代码中的一个模块包含了若干个代码文件、一群具体代码…… mysql支持多种存储方案Innodb是当下最主流的一种方式
2.分析 索引主要是为了快速查找这方面红黑树和哈希表效率高。 哈希表不适合数据库的查询场景哈希表是通过hash函数来得到一个确定的下标而且只能做精确查询没法做模糊查询和范围查询红黑树不适合数据库的查询场景元素有序时可以处理范围查询但是在元素个数比较多的时候红黑树的高度会高对应的比较次数会多14个数据就有4层了而每次比较都在内存上都要进行硬盘IO操作 B树
为了解决上述问题出现了为数据库量身定做的数据结构 ------ B树 1B树 在了解B树之前需要先了解下B树有时写作B--是连接符不是减号 B树本质上是一个N叉搜索树一个节点上可以保存多个keyN个key就能延伸出 N1 个分叉来N个key就划分出 N1 个区间 此时每个节点上都可以保存多个元素了对于数据库来说每个节点都需要把数据从硬盘上读取出来才能进行比较一个节点有多个key和一个节点上有一个key硬盘IO的开销是差不多的就像下楼倒一个垃圾和倒四个垃圾时间上没太多区别所以B树的高度是远远小于二叉搜索树的所以进行查询的时候硬盘IO的次数会减少B树查询元素的流程 1从根节点出发判定要查找的元素是否在根节点上存在 2如果不存在看这个元素在哪个区间然后根据这个区间的路线往下一个节点找最终找到叶子结点如果到叶子结点还不存在那就是真的不存在对于B树来说在进行插入元素和删除元素的时候会涉及到拆分和合并的操作。 1一个节点可以存多个key但是不能无限地存当存储的key数量达到一定程度的时候就需要把这个节点给拆分把这个节点中的一部分以树的子节点的方式重新组织 2这样可以保持当前这个节点中key的数量始终不会太多能延伸出新的叶子结点 2B树 【1】B树也是N叉搜索树但是N个key分出了N个区间其中节点上最后一个key就是最大值也可以取最小值
【2】父节点的key会在子节点中重复值出现以最大值的身份虽然有很多重复元素看起来浪费了空间实际上能够达成 **叶子结点这一层包含了整个数据的全集 **的效果
【3】把叶子结点按照链表这样首尾相连就可以通过叶子结点之间的连接快速找到“上一个”“下一个”元素这也方便进行范围查询
优势
擅长范围查询所有的查询操作最终都会落在叶子节点上比较次数是均衡的查询时间是稳定的有时 ‘稳’ 比 ‘快’ 更重要由于叶子节点上是完整的数据全集因此表的每一行数据的其他列都可以保存到叶子节点上而非叶子节点只存储构建索引的key即可。此时非叶子节点的存储空间消耗是非常小的我们甚至可以在内存中缓存一份。这样在进行数据查询的时候就可以通过内存来直接进行比较从而更快速地找到叶子节点上的记录也进一步减少硬盘IO的次数
二、事务
使用场景:为了完成某个工作需要多组sql操作。如A转账给B那么需要先给A的账户余额减钱再给B账户加钱概念事务的本质就是为了把多个操作打包成一个操作来完成让这多个操作要么全都能执行成功要么就一个都不执行不然就像给A扣钱了但是没给B加钱--------- 事务的原子性这些操作是一个整体不能再分割了 这个“一个都不执行”不是真的没执行执行成不成功得执行了才知道真正执行时是不知道哪一步操作会失败的如果执行到中间出错了就需要自动地把前面已经成功执行的操作还原回最初没有执行的模样所以本质上这个“一个都不执行”不是真的没执行而是看起来就像没执行一样还原回最初是【回滚】回滚要把事务中执行的每个操作都记录下来如果需要回滚就直接按照之前操作的“逆操作”来执行就行了 操作的记录是通过特定的日志来记录的。日志的数据是始终在硬盘上存在的即使是数据库服务器重启也能在重启后根据之前没有回滚完的情况继续进行处理 使用 开启事务start transaction;执行多条SQL语句手动触发回滚或提交事务rollback/commit rollback即是全部失败commit即是全部成功一个事务务必要以这两个操作结尾如果没有这两个操作接下来的各种sql操作都会被认为是事务的一部分 事务的基本特性 原子性保证多个操作被打包成一个整体要么能够全部执行正确要么就一个都不执行一致性事务执行之前和事物执行之后数据能对上。这依靠约束和回滚机制来实现持久性事务这里执行的各种操作一旦事务执行成功了这里的所有操作产生的修改都会写到硬盘中即持久生效的隔离性并发执行事务的时候隔离性会在执行效率和数据可靠之间做出权衡“隔离”描述的是同时执行的事务之间相互的影响隔离性越高并发性就越低数据越可靠性能就越低 并发意思是“同时执行”数据库是一个客户端服务器结构的程序既然是服务器服务器就可以同一时刻给多个客户端提供服务多个客户端都能给服务器提交事务如果提交的这两个事务是修改不同的数据库/表相互独立那没什么影响。但是如果修改的是一个库/表顺序的先后会影响最终的执行结果就会出现问题脏读、不可重复读、幻读
1. 脏读
问题描述读到的数据是一个临时的数据不是最终的数据“脏”表示临时的并非是最终准确结果
解决方法给写操作加锁一个事务A写的时候其他事务B不能读了直到A事务写完数据提交事务其他的事务B才能来读取数据。
效果引入了写加锁降低了两个事务之间的并发性提高了隔离性降低了效率使数据更加准确了
2. 不可重复读 问题描述一个事务中两次读到的数据不一致在读的过程中另一个事务修改了数据
解决方法给读操作加锁别人读的时候我不能写除非是写完提交后别人才能读此时别人读的时候可以再开启一个事务来写第二个事务提交之前其他读事务读到的都是旧版本数据第二个事务提交之后别人再读读到的就是新版数据了
效果并发程度又进一步降低了隔离性提高执行效率降低数据更加可靠
3. 幻读 问题描述一个事务在多次读的过程中虽然读到的数据的值是一样的但是结果集是不同的多出或少出一些记录可以视为是不可重复读的特殊情况
解决方法串行化彻底放弃并发执行事务所有的事务都是一个挨着一个地串行执行执行完一个事务再执行下一个事务
效果并发性最低隔离性最高效率最低数据最可靠
4. mysql的四种事务的隔离级别