索引是帮助mysql高效获取数据的数据结构。
可以理解为:排好序的快速查找的数据结构
索引会影响到where后面的查找,和order by后面的排序。
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据。这样就可以在这些数据结构上实现高级查找算法,这种数据结构,就是索引
update更新慢,数据在改,索引也在改。
索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存在于磁盘中、
df -h 查看磁盘空间
我们平时所说的索引,一般指B树(多路搜索树)结构组织的索引、其中聚集索引、次要索引、复合索引、前缀索引、唯一索引,默认都是使用B+树索引。除了B+树索引之外还有哈希索引。
优势:提高数据检索效率,降低数据库io成本
通过索引列对数据进行排序,降低数据排序的成本,降低了cpu的消耗
劣势:
索引也是一张表,保存了主键与索引字段,并指向实体表的记录,所以索引列也要占空间,
2.虽然索引提高了查询速度,但是降低了更新表的速度,:增删改。更新表的时候,mysql还要保存一下索引文件,每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。
3、索引只是提高效率的一个因素,如果mysql有大数据量的表,就需要研究最优秀的索引。
1、主键自动建立索引
2、频繁作为查询条件的字段应建立索引
3、查询中与其他表关联的字段,外键关系建立索引
4、频繁更新的字段不适合创建索引
5、where子句里用不到的字段不要创建索引
6、单值/复合索引?(在高并发下倾向于复合索引)
7、查询中排序字段,排序字段若通过索引去访问,将大大提高排序速度
8、查询中统计或分组的字段,
不建:
1、表记录太少(300万)
2、经常增删改的表,不建
3、数据重复,且分布平均的表字段。
4、定义为text、image和bit数据类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
一个索引的选择性越接近1,这个索引的查询效率就越高
mysql的事务:
指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全地不执行。
通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠
满足ACID属性,由DBMS中的事务管理子系统负责事务的处理。
redis的事务:
redis单条命令保存原子性,但redis的事务不保证原子性。
事务本质:一组命令的集合。命令被放到队列中,一个事务的所有命令都会被序列化,在事务执行过程中会按照顺序执行。
一次性,顺序性,排他性,执行一系列的命令。
left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录。
inner join(等值连接) 只返回两个表中联结字段相等的行
mysql的事务:
指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全地不执行。
通过将一组相关操作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠
满足ACID属性,由DBMS中的事务管理子系统负责事务的处理。
1、原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚。
2、一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
拿转账来说,假设用户A和用户B两者的钱加起来一共是5000,那么不管A和B之间如何转账,转几次账,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
3、隔离性是一个事务所做的修改在最终提交以前,对其他事务是可不见的。
当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
即要达到这么一种效果:对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,这样每个事务都感觉不到有其他事务在并发地执行。
多个事务并发访问时,事务之间是隔离的,一个事务不应该影响其它事务运行效果。这指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。
不同的隔离级别:
Read Uncommitted(未提交读):最低的隔离级别,什么都不需要做,一个事务可以读到另一个事务未提交的结果。所有的并发事务问题都会发生。
Read Committed(已提交读):只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题。
Repeated Read(可重复读):在一个事务中,对于同一份数据的读取结果总是相同的,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交。可以解决脏读、不可重复读。
Serialization(可串行化):事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
4、持久性:一旦事务提交,则其所做的修改将会永远保存到数据库中。是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
例如我们在使用JDBC操作数据库时,在提交事务方法后,提示用户事务操作完成,当我们程序执行完成直到看到提示后,就可以认定事务以及正确提交,即使这时候数据库出现了问题,也必须要将我们的事务完全执行完成,否则就会造成我们看到提示事务处理完毕,但是数据库因为故障而没有执行事务的重大错误。
第一范式:属性不可分。 当关系模式R的所有属性都不能再分解为更基本的数据单位时,称R是满足第一范式
第二范式:R满足第一范式,并且R的所有非主属性都完全依赖于R的每一个候选关键属性,称R满足第二范式
第三范式: 设R是一个满足第一范式条件的关系模式,X是R的任意属性集,如果X非传递依赖于R的任意一个候选关键字,称R满足第三范式,即非主属性不传递依赖于键码
事务隔离:
同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。
未提交读
已提交读
可重复读
串行化
MVCC是一种多版本并发控制机制,是MySQL的InnoDB存储引擎实现隔离级别的一种具体方式,用于实现提交读和可重复读这两种隔离级别。MVCC是通过保存数据在某个时间点的快照来实现该机制,其在每行记录后面保存两个隐藏的列,分别保存这个行的创建版本号和删除版本号,然后Innodb的MVCC使用到的快照存储在Undo日志中,该日志通过回滚指针把一个数据行所有快照连接起来。
通过建立索引对查询进行优化
对查询进行优化,应尽量命中索引,避免全表扫描,尽可能的排序和查找都命中索引。
1、Mysql中的数据用不同的技术,存储在文件(或内存)中,每种技术:不同的存储机制,索引技巧,锁定水平,提供广泛不同的功能和能力。选择不同的技术,获得相应的速度或功能。从而改善应用的整体功能。
数据库引擎是用于存储、处理和保护数据的核心服务。利用数据库引擎可控制访问权限并快速处理事务。
创建用于存储数据的表和用于查看、管理和保护数据安全的数据库对象(如索引、视图和存储过程)。
MySQL存储引擎主要有: MyIsam、InnoDB、Memory、Blackhole、CSV、Performance_Schema、Archive、Federated、Mrg_Myisam。
2、InnoDB是一个事务型的存储引擎,有行锁和外键约束。
适用场景:
经常更新的表,适合处理多重并发的更新请求。