初衷
关于面试肯定会考察的一个知识点,不要在送分题上面倒下~~~
言归正传,赶紧开始吧
复制代码
mysql优化
首先总结一下这里可能考察到的知识点,搞个list列出来,然后逐个击破~
通过慢查询日志定位慢查询sql,然后优化相关
explain 分析慢查询sql
索引问题,如何优化索引,不支持函数索引,
索引命中的问题
mysql的引擎有哪几种,myisam和innodb各自的优缺点
innodb的事务
脏读(Dirty Reads)不可重复读(Non-Repeatable Reads)幻读(Phantom Reads)
innodb的行锁详解
关于死锁
mysql雪崩
随便侃侃INNODB和MYISAM
关于mysql的引擎和索引,mysql的常用引擎无非是innodb和myisam
MyISAM
不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁;
不支持事务
不支持外键
不支持崩溃后的安全恢复
在表有读取查询的同时,支持往表中插入新纪录
支持BLOB和TEXT的前500个字符索引,支持全文索引
支持延迟更新索引,极大地提升了写入性能
对于不会进行修改的表,支持 压缩表 ,极大地减少了磁盘空间的占用
MyISAM性能极佳,而且提供了大量的特性,
包括全文索引、压缩、空间函数等,
但MyISAM不支持事务和行级锁,
而且最大的缺陷就是崩溃后无法安全恢复。
现在大多数时候我们使用的都是InnoDB存储引擎,但是在某些情况下使用MyISAM更好,比如:MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。
复制代码INNODB
支持行锁,采用MVCC来支持高并发,有可能死锁
支持事务
支持外键
支持崩溃后的安全恢复
不支持全文索引
InnoDB的最大特色就是支持了ACID兼容的事务(Transaction)功能
复制代码
innodb和myisam对比
count运算上的区别: 因为MyISAM缓存有表meta-data(行数等),因此在做COUNT(*)时对于一个结构很好的查询是不需要消耗多少资源的。而对于InnoDB来说,则没有这种缓存。
是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是InnoDB提供事务支持事务,外部键等高级数据库功能。
具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。
是否支持外键: MyISAM不支持,而InnoDB支持。
MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务MyISAM是最好的选择。
复制代码
mysql的存储引擎的索引
索引
MyISAM引擎
InnoDB引擎
Memory引擎
B-Tree索引
支持
支持
支持
HASH索引
00
0
支持
R-Tree索引
支持
0
0
Full-text
支持
0
0
建立索引的原理
最左前缀原则
在提这个之前要先说下联合索引,MySQL中的索引可以以一定顺序引用多个列,这种索引叫做联合索引,一般的,一个联合索引是一个有序元组,其中各个元素均为数据表的一列。另外,单列索引可以看成联合索引元素数为1的特例。
复制代码
索引匹配的最左原则具体是说,假如索引列分别为A,B,C,顺序也是A,B,C:
- 那么查询的时候,如果查询【A】【A,B】 【A,B,C】,那么可以通过索引查询
- 如果查询的时候,采用【A,C】,那么C这个虽然是索引,但是由于中间缺失了B,因此C这个索引是用不到的,只能用到A索引
- 如果查询的时候,采用【B】 【B,C】 【C】,由于没有用到第一列索引,不是最左前缀,那么后面的索引也是用不到了
- 如果查询的时候,采用范围查询,并且是最左前缀,也就是第一列索引,那么可以用到索引,但是范围后面的列无法用到索引
复制代码特别注意,当你遇到范围索引的时候,联合索引后面的索引便会失效
慢查询
开启慢查询日志
log-slow-queries=/home/phpernote.com-slow.log
然后就是慢查询sql的explain
先这样吧~~,一口气吃不成胖子,每一个知识点都要吃透才行
路艰且长啊~~~待会去面试,上面应该够扯了,不够的话后面再查漏补缺,继续学习~~~