ACID是靠什么保证的?
原子性由undolog日志来保证,它记录了需要回滚的日志信息,事务回滚时撤销已经执行成功的sql
一致性是由其他三大特性保证,程序代码要保证业务上的一致性
隔离性是由MVCC来保证,多版本并发控制
持久性由redolog来保证,mysql修改数据的时候会在redolog中记录一份日志数据,就算数据没有保存成功,只要日志保存成功了,数据仍然不会丢失
mysql复制原理是什么?
(1) master服务器将数据的改变记录二进制binlog日志,当master上的数据发生改变时,则将其改变写入二进制日志中;
(2)slave服务器会在一定时间间隔内对master二进制日志进行探测其是否发生改变,如果发生改变,则开始一个I/OThread请求master二进制事件
(3)同时主节点为每个I/O线程启动一个dump线程,用于向其发送二进制事件,并保存至从节点本地的中继日志中,从节点将启动SQL线程从中继日志中读取二进制日志,在本地重放,使得其数据和主节点的保持一致,最后I/OThread和SQLThread将进入睡眠状态,等待下一次被唤醒。
也就是说:
●从库会生成两个线程,一个I/O线程,一个SQL线程;
●I/O线程会去请求主库的binlog,并将得到的binlog写到本地的relay-log(中继日志)文件中;·主库会生成一个log dump线程,用来给从库I/O线程传binlog;
●SQL线程,会读取relay log文件中的日志,并解析成sql语句逐一执行;
mysql聚簇和非聚簇索引的区别是什么?
mysql的索引类型跟存储引擎是相关的,innodb存储引擎数据文件跟索引文件全部放在ibd文件中,而myisam的数据文件放在myd文件中,索引放在myi文件中,其实区分聚欲索引和非聚裁索引非常简单,只要判断数据跟索引是否存储在一起就可以了。
innodb存储引擎在进行数据插入的时候,数据必须要跟索引放在一起,如果有主键就使用主键,没有主键就使用唯一键,没有唯一键就使用6字节的rowid,因此跟数据绑定在一起的就是聚簇索引,而为了避免数据冗余存储,其他的索引的叶子节点中存储的都是聚簇索引的key值,因此innodb中既有聚簇索引也有非聚簇索引,而myisam中只有非聚簇索引。
索引的数据结构
MySQL主要用到西种结构:B+Tree索引和Hash索引Inodb存储引擎 默认是 B+Tree索引
Memony 存储引擎 默认 Hash索引;
MySQL中,只有Memory(Memory表只存在内存中,断电会消失,适用于临时表)存储引擎显示支持Hash索引是Memory表的默认索引类型,尽管Memory表也可以使用B+Tree索引。Hash索引把数据以hash形式组织起来因此当查找某一条记录的时候,速度非常快。但是因为hash结构,每个键只对应一个值,而且是散列的方式分布。所以它并不支持范国查找和排序等功能。B+Tree是mysql使用最频繁的一个索引数据结构,是|nnoDB和MyISAM存储引擎模式的索引类型。相对Hash索引,B+Tree在查找单条记录的速度比不上Hash索引,但是因为更适合排序等操作,所以它更受欢迎。毕竟不可能只对数据库进行单条记录的操作。
对比:
hash类型的索引:查询单条快,范围查询慢
btree类型的索引:b+树,层数越多,数据量指数级增长(我们就用它,因为innodb默认支持它)
mysql索引结构有哪些,各自的优劣是什么?
索引的数据结构和具体存储引擎的实现有关,mysql中使用较多的索引有hash索引,B+树索引,innodb的索引实现为B+树,memory存储引擎为hash索引。
B+树是一个平衡的多叉树,从根节点到每个叶子节点的高度差值不超过1,而且同层级的二节点间有指针相关连接,在B+树上的常规检索,从根节点到叶子节点的搜索效率基本相当,不会出现大幅波动,而且基于索引的顺序扫描时,也可以利用双向指针快速左右移动,效率非常高。因为,B+树索引被广泛应用于数据库、文件系统等场景。
哈希索引就是采用一定的哈希算法,把键值换算成新的哈希值,检索时不需要类似B+树那样从根节点到叶子节点逐级查找,只需一次哈希算法即可立刻定位到相应的位置,速度非常快。
如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值,前提是键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,知道找到对应的数据
如果是范围查询检索,这时候哈徐索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索
哈希所有也没办法利用索引完成排序,以及like这样的部分模糊查询
哈希索引也不支持多列联合索引的最左匹配规则
B+树索引的关键字检索效率比较平均,不像B树那样波动大,在有大量重复键值情况下,哈希索引的效率也是极低因此存在哈希碰撞问题的
最左原则是
最左前缀原则是数据库索引设计中的一个重要原则,当联合家引包含多个列时,查询语句可以利用从左到右的顺序使用索引,但只能连续使用最左侧的列来进行索引扫描。也就是说,如果一个查询只使用了联合索引中的部分列作为查询条件,那么只有从索引的最左侧列开始连续使用时,索引才会有效。
例如,假设有一个联合索引(a,b,c),那么查询条件中包含a和b的查询可以利用该索引,而只包含b或者只包含c的查询则无法使用该索引。
最左前缀原则的目的是使索引具有更高的选择性,提高查询效率。由于数据库索引是按照索引列的顺序构建的,选择性高的列放在最左侧可以减少需要检查的索引块数量,从而提高查询性能。需要注意的是,最左前缀原则并不限制查询条件的顺序,只要满足从左到右连续使用索引列即可。此外,如果查询条件不符合最左前缀原则,数据库仍然可以通过全表扫描等方式执行查询,但这种方式通常效率较低。综上所述,最左前缀原则是指在联合索引中只有从最左侧列开始连续使用时,索引才能被有效利用,这有助于提高查询性能和选择性
mysql锁的类型有哪些?
基于锁的属性分类:共享锁、排他锁。
基于锁的粒度分类:行级锁(innodb)、表级锁(innodb、myisam)、页级锁(innodb引学)、记录锁、间隙锁、临键锁。
基于锁的状态分类:意向共享锁、意向排它锁。
explain执行记录的type
type显示的是访问类型,访问类型表示我是以何种方式去访问我们的数据,最容易想的是全表扫描,直接暴力的
遍历一张表去寻找需要的数据,效率非常低下,访问的类型有很多,效率从最好到最坏依次是:
system > const > eq_ref> ref> fulltext > ref_or_null> index_merge > unique_subquery> index_subquery>range >index>ALL
一般情况下,得保证查询至少达到range级别,最好能达到ref
简述Myisam和Innodb的区别?
InnoDB存储引擎:主要面向0LTP/Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDE第一个支持申务的存储引擎,已经停止开发)。特点:
1 支持行锁
2 支持外键
3 支持自动增加列AUTO_INCREMENT居性
4 支持事务
5 支持MVCC模式的读写
6 读的效率低于MYISAM
7.写的效率高优于MYISAM
8,适合频繁修改以及设计到安全性较高的应用
9.洁空整个表的时候,Innodb是一行一行的删除,
MyISAM存储引擎:是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。
特点:
1独立于操作系统,当建立一个MyISAM存储引擎的表时,就会在本地磁盘建立三个文件,例如我建立tb_demo表,那么会生成以下三个文件cb_demo.frm,tb_demo.MYD,tb_demo.MYl2 不支持事务
3 支持表锁和全文索引,粒度是比较大的
4 MYISAM存储引孕表由MYD和MYI组成,MYD用来存放数据文件,MY1用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;
5 MySQL5.0版本开始,MyISAM默认支持256T的单表数据;
6.选择密集型的表:MYISAM存储引李在筛选大量数据时非常迅速,这是他最突出的优点
7.读的效率优于InnoDB
8.写的效率低于InnoDB
9.适合査询以及插入为主的应用
10.清空整个表的时候,MYISAM则会新建表
怎么处理MySQL的慢查询?
1、开启慢查询日志,准确定位到哪个sql语句出现了问题
2、分析sql语句,看看是否load了额外的数据,可能是査询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写
3、分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者惨改索引,使得语句可以尽可能的命中索引
4、如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分
表。