MySQL学习之路(三)
MySQL调优的知识
本质:数据库查询慢的原因是因为IO阻塞(操作硬盘)
相当于一个同心圆,在同一个园上旋转速度很快(旋转),但是要先寻找是哪一个圆(寻道),所以需要创建索引来迅速找到是哪一条道路;
一、索引优化
作用:提高访问效率,是一种数据结构
增加索引SQL语句
为了优化速度,最好走索引
1、mysql查询底层架构
2、背景
当mysql到执行器的那一步会涉及到IO操作,所以必须优化IO操作
所以引入了索引
3、索引的数据结构选择
mysql选择B+树这个数据结构,选择这个结构的优势在于层数较少遍历快,并且对于B树来说把每层的data数据放在了最底层,其他层可以节约空间放更多的索引数(因为每一页只能存放16kb数据),一般层数为3或4层,层数不是自己决定的。
4、索引的基础知识
第二条语句无法匹配,因为无法找到name的key,所以无法进行后续匹配
什么叫存储引擎:存储是将数据落在磁盘的过程,分为innodb(直接上数据)和mysam(储存地址)
面试问题:为什么数据库逐渐都要自增(是为了维护索引,防止页分裂),因为B+树是有序的,元素值的添加可能会影响整个树的结构或者层数
5、索引使用相关细节
(1)or条件下不走索引
(2)or语句但是id和name都是索引可以使用union关键词
(3)最左匹配原则(复合索引,辅助索引)
当有两个及以上的时候,需要最左匹配,不然无法走索引
(4)优化分页
二、性能监控
作用:在执行ssql语句的时候,可以用性能监控来看运行时间
set profiling=1 -- 打开
show profiles --查看使用时间
show profiles --查看每一步使用了多少时间 (已经弃用)
使用performance schema数据库来监控mysql
三、schema与数据库类型优化
1、数据类型优化
(1)在可以的情况下,使用占用内存小的数据类型;(int与char等,尽量避免null;
(2)合理使用范式与反范式,解决数据冗余问题;
(3)主键的选择,使用与业务无关的代理主键;
(4)字符集的选择;
(5)存储引擎的选择:MYSAM(储存的数据地址非聚集索引)、INoDB(直接在节点中储存数据聚集索引)
(6) 少用 * 用具体的字段,
四、执行计划
explain select*from t_student
可以使用执行计划来查看数据库查询语句所耗费的性能,比如是否是全盘扫描,是否走了索引
六、主从复制和读写分离
1、为什么要主从复制读写分离?
主从复制:是一种数据备份的方案。
简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。
读写分离:是一种让数据库更稳定的的使用数据库的方法。
是在有从数据库的情况下使用,当主数据库进行对数据的增删改也就是写操作时,将查询的任务交给从数据库。
为什么要使用主从分离和读写操作呢?
主从复制:①当主数据库出现问题时,可以当从数据库代替主数据库,可以避免数据的丢失。②可以进行读写分离
读写分离:①避免从数据库进行写操作而导致的主从数据库数据不一致的情况,因为当主从数据库数据不一致时,那么从数据库最主要的备份任务就没有意义了。②减轻主数据库的压力。因为进行写操作更耗时,所以如果不进行读写分离的话,写操作将会影响到读操作的效率。
2、主从复制原理
(1)主数据库(master)在每个事务更新数据完成之后,主数据库(master)在二进制日志记录这些改变。
(2)从数据库(slave)开启一个I/O线程,读取主数据库(master)的二进制日志文件,然后写入到从数据库(slave)的中继日志。I/O线程会在master打开一个连接,从数据库I/O线程从主数据库
(master)的二进制日志中读取事件,如果已经连接上,它会睡眠并等待主数据库(master)产生新的事件,I/o线程将这些事件写入到中继日志。I/O一般缓存在OS上,系统开销比较小。
(3)从数据库SQL线程读取中继日志中的事件,并重放其中的事件,更新从数据库的数据,保证主从复制的数据一致性。
如果看完对自己有所帮助,请点赞支持,谢谢大家