MySQL
1.事务
事务的定义
-
事务指一个任务中由一组sql语句组成,这些SQL语句要么全部执行,要么全部不执行
事务的属性
-
原子性:事务是业务逻辑单元中不可在分割的,事务开始后所有操作,事务中的多个sql语句,要么同时成功,要么都不执行,不可能停滞在中间环节,
-
一致性:事务一旦接结束,内存中的数据和数据库中的数据是保持一致的
-
隔离性:事务之间互不干扰,一个事务的结束意味着下一个事务的开启
-
持久性:事务一旦提交,则数据持久化到数据库中,永久保存,不能回滚
事务的并发问题
-
脏读:
指一个事务正在访问数据,并且对这个数据进行修改,这种修改还没有提交到数据库中,而另一个事务也访问了这个数据,并且使用了这个数据,
解决方法;一个事务在修改数据时,该数据不能被其他事务访问
-
不可重复读:
是指一个事务多次读取同一条记录,如果此时另一个事务也访问,并且修改了该数据,则就会出现多次读取出现数据不一致的情况,原来的数据变成了不可重复读取的数据
解决方法:只有在修改事务完全提交过后才可以读取到数据
-
幻读:
是指一个事务修改表中的多行记录,但是此时另一个事务对该表格进行了插入数据的操作,则第一个事务会发现表格中会出现没有被修改的行,就像发生了幻觉一样.
解决方法:在一个事务提交数据之前,其他事务不能添加数据
2.索引
-
概念
对于数据库来说,索引的作用就是给数据加目录。创建索引的目的就是为了提高查询速度
-
建立原则
-
优缺点
优点:加快了查询的速度
缺点:降低了增删改的速度,增大了表的文件大小(索引文件甚至可能比数据文件还大)
-
类型
普通索引:允许出现相同的索引类容,仅仅是加快了查询的速度
唯一索引:不可以出现相同的值,可以出现null值
主键索引:不能重复相同的值,且不能为null,一个表只能有一个主键索引
全文索引:针对较大的数据,生成全文索引很耗时好空间
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则。
-
底层数据结构
-
B+树
-
-
为什么不用B树
-
B+树更适合硬盘存储,由于非叶子节点不存储data,作为索引开销,所以一个节点可以存储更多的内节点,每个节点能索引的范围更大更准确,也就是说使用B+树单次磁盘IO的信息量相比较B树更大,IO效率更高
MySQL是关系型数据库,经常会按照区间来访问某一个索引列,B+树的叶子节点间按顺序建立了链指针,加强了区间的访问性,所以B+树对索引列上的区间范围查询很友好,而B树每个节点的key
-
增删改查对所索引的影响
-
优化SQL查询
1.使用索引
使用索引时,应尽量避免全表扫描,首先应考虑在 where 及 order by ,group by 涉及的列上建立索引。
2.优化SQL语句
分析查询语句:通过对查询语句的分析,可以了解查询语句执行情况,找出查询语句执行的瓶颈,从而优化查询语句。
任何地方都不要使用select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
不在索引列做运算或者使用函数。
查询尽可能使用 limit 减少返回的行数,减少数据传输时间和带宽浪费。
3.优化数据库对象
1)优化表的数据类型
使用 procedure analyse()函数对表进行分析,该函数可以对表中列的数据类型提出优化建议。表数据类型第一个原则是:使用能正确地表示和存储数据的最短类型。这样可以减少对磁盘空间、内存、CPU缓存的使用。
使用方法:select * from 表名 procedure analyse();
2)对表进行拆分
通过拆分表可以提高表的访问效率。
4.硬件优化
1)CPU优化
选择多核和主频高的CPU。
2)内存的优化
使用更大的内存。将尽量多的内存分配给MySQL做缓存。
3)磁盘I/O的优化
5.MySQL自身的优化
对MySQL自身的优化主要是对其配置文件my.cnf中的各项参数进行优化调整。如指定MySQL查询缓冲区的大小,指定MySQL允许的最大连接进程数等
6.应用优化
1)使用数据库连接池
2)实用查询缓存
它的作用是存储 select 查询的文本及其相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中直接得到查询结果。查询缓存适用的对象是更新不频繁的表,当表中数据更改后,查询缓存中的相关条目就会被清空。
Redis
==============================================================================================================================================================================================================
Redis与MySQL的区别,以及Redis的优势
1.MySQL和Redis的数据库类型
MySQL是关系性数据库,主要用于存放持久化的数据,将数据存储到磁盘中,读取速度慢,
Redis是非关系型数据库,也是缓存数据库,即将数据存放在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限
2.作用上
mysql用于持久化的存储数据到硬盘,功能强大,速度较慢,基于磁盘,读写速度没有Redis快,但是不受空间容量限制,性价比高
redis用于存储使用较为频繁的数据到缓存中,读取速度快,基于内存,读写速度快,也可做持久化,但是内存空间有限,当数据量超过内存空间时,需扩充内存,但内存价格贵
3.需求上
mysql和redis因为需求的不同,一般都是配合使用。
需要高性能的地方使用Redis,不需要高性能的地方使用MySQL。存储数据在MySQL和Redis之间做同步
Redis使用场景
Redis数据类型 数据结构
基本数据的增删改查命令
Redis和数据库的一致性
持久化机制:AOF,RDB