平台一直维护是不是要跑路了,seo网站推广全程实例,网站高并发前端怎么做,网站怎么上传ftp索引
是什么
类似于目录#xff0c;提高查询的速度#xff0c;但是本身会占用空间#xff0c;增删数据的时候也需要维护索引。所以查询操作频繁的时候可以创建索引。如果非条件查询列#xff0c;或经常做插入、修改操作#xff0c;或磁盘空间不足时#xff0c;不考虑创…索引
是什么
类似于目录提高查询的速度但是本身会占用空间增删数据的时候也需要维护索引。所以查询操作频繁的时候可以创建索引。如果非条件查询列或经常做插入、修改操作或磁盘空间不足时不考虑创建索引。
创建主键约束primary key唯一约束unique外键约束foreign key时会自动创建对应列索引。
查询索引
show index from 表名
创建索引
当数据库的数据量很大时创建和删除索引是很危险的操作会大量消耗CPUIO等资源可能导致数据库卡死。所以要在放入数据之前或者数据库中的数据量不大时创建索引。如果要给一个数据量很大的数据库添加索引就需要再准备一个服务器在空的数据库中创建好索引将另一个数据库的数据慢慢导入这个空的数据库里。
create index 索引名 on 表名列名 //底层是创建出一棵独立的B树来组织索引跟主键的B树没有关联。是两棵独立的树。
删除索引
drop index 索引名 on 表名
底层结构
数据库的索引是用B树表示存储的。
B树结构 仅叶子节点存储数据并通过链表指针连接叶子节点从左到右是有序的且存储在一块连续内存空间避免频繁访问硬盘一次硬盘IO就能读出整个节点数据访问的数据都在叶子节点树高一样则每次查询次数是稳定的
非叶子节点存储键键值为其叶子节点中的最大值方便进行范围查询锁定叶子节点中数据的位置
当叶子节点个数达到阈值会进行分叉。索引在内存中个数增加了对速度影响不大但叶子节点存在硬盘中访问硬盘的速度比访问内存满很多所以要进行分叉根据索引查找数据时范围更精确
1.N叉搜索树多叉树可以控制树的高度
2.父节点以叶子节点中最大值的形式存在快速锁定子树的数据范围
3.叶子节点这一层用链表结构连上不用再回溯到父节点。范围查寻更高效
4.数据存储在叶子节点索引存在非叶子节点中因为占用空间小索引就存在内存中。索引在内存中加快查找速度
为什么用B树不用其他数据结构
AVL树是严格的自平衡二叉搜索树子树高度差不能超过1随便进行一下增删改就会触发AVL树旋转。每一次旋转都有对应的开销所以用AVL树除了查询外其他操作的效率不高每一次增删都需要维护树的平衡
而红黑树虽然旋转的概率没有AVL树高但他是二叉树当数据量很大时树的高度就会很高高度每增加一层查询比较次数就多一次而数据库数据索引是存储在硬盘上的每一次对硬盘的IO操作很耗时间查询的速度就会慢很多
hash表存储数据是无序的不能进行范围查询不能用或者找到一个范围的数据只能比较相同key值的数据因为经过hash函数的计算原来key之间的大小关系 已经不能通过计算出来的hash值反应了。
事务
什么是事务
当实现一个目的需要多个sql语句执行时将这些sql语句打包成的一个整体称作事务。事务中的sql语句要么全部执行成功要么全部失败。对于转账这类场景开启事务更能保证安全。当A给B转账500A的账号-500如果设备发生故障sql没执行完B的账户没有500如果没有开启事务那么这500就消失了。开启事务后出现故障后会撤销对A账户执行的操作将A账号的金额还原到转账前。
使用
1.start transaction ;//开启事务
2.中间执行多个sql语句
3.rollback或commit
rollback表示回滚中间的sql语句全部执行失败commit表示提交sql全部执行成功。 进行回滚了name为a的数据没有插入成功。
基本特性
1.原子性
事务里的sql语句执行要么都成功执行要么都不执行。当一部分sql语句执行成功出现网络崩溃计算机死机主机掉电等操作时像网络崩溃这种不影响数据库的则会执行回滚操作将已经执行的sql语句造成的影响恢复到没执行时候的情况。当事务执行时sql语句会记录在mysql日志中像主机掉电这种情况数据库没办法运行的时候也不影响执行回滚操作当电来了恢复正常数据库会根据日志信息执行回滚。
2.一致性
执行事务之后数据能对得上事务没执行成功执行回滚后能与执行事务之前数据一样。
3.持久性
持久性指数据被存在硬盘上主机/程序重启后数据依然存在。事务执行具有持久性对数据库造成的修改会保存在硬盘上持久存在。
4.隔离性
在执行并发操作时存在的概念。隔离性提高并发能力就降低数据库服务器执行效率就会降低但数据准确性会提高 。当多个客户端同时对服务器发起事务时可能存在下面几种情况。
1.脏读问题读取到其他事务未提交的数据
当执行事务A对某一张表做一些修改时事务B在事务A还没执行完就来读取这张表的数据但是B这时读取的表的数据是临时的B如果基于这个临时数据进行一些操作结果可能不正确。这样导致的问题称作脏读问题这个临时数据也称‘脏数据’。
2.不可重复读问题指同一事务内相同查询条件多次执行结果不同数据值被修改
当事务B有多个读的操作时有一个事务C要对这张 表做修改这样可能导致事务B多个读的结果前后不一致。
3.幻读问题指同一事务内相同范围查询返回的行数发生变化新增或删除行这是不可重复读的特殊情况。
MySQL 的四个隔离等级
可以在MySQL的配置文件中设置等级
1.read uncommitted:允许读取其他事务未提交的数据 //存在脏读不可重复读幻读
这样就是降低了并发时事务之间的影响提高了隔离性牺牲了部分效率提高了数据准确性。
2.read committed:只能读取其他事务提交后的数据//解决脏读 存在不可重复读幻读进一步降低了并发性提高安全性。
3.repeatable read: 针对读和写操作都加锁了//解决了脏读不可重复读存在幻读问题 MySQL默认隔离等级
4.串行化(serialiable) :所有事务串行执行//严格的一个接一个执行这时完全没有并发也就不存在上诉三个问题隔离性是最高的效率是最低的。