(1)sql执行顺序是什么?
from(查询范围)》join(连表查询)》where(查询条件)》group by(分组)》having(分组条件)》select(查询字段)》distinct(去重)》order by (排序)》limit(查询条数)
(2)MyISAM和InnoDB的区别?
InnoDB支持事务、行锁、聚簇索引、采用数据页存储方式(每个表对应一个表空间,存储在data目录下。表名.ibd),实际开发中默认使用InnoDB存储引擎。
双写缓冲区,自适应hash索引和BufferPool一起被称为innodb的三大特性。
MyISAM不支持事务、支持表锁、每个表采用.frm表结构文件 .myd数据文件 .myi索引文件存储。
(3)MySQL中的悲观锁和乐观锁?
MySQL中的乐观锁可以基于版本号实现,在数据表中增加一个版本号字段,更新前查询版本号,在更新时候进行版本号对比。
MySQL悲观锁可通过select for update实现。基于数据库行锁机制。
(4)什么情况下索引会失效?
查询条件使用不等于、左模糊匹配、or、函数计算
查询条件设计到类型转换
组合索引前一个索引使用范围查询
数据表数据量较少时
(5)说下B+树和B-树?
(6)explain执行分析?
explain是一个分析sql执行计划的命令。
explain结果参数:select_type参数、type参数(const、eq_ref、ref、range、index、all)、key参数、req参数、select_type参数、extra参数。
type参数含义:const级别标识使用了主键或唯一索引,效率高。
eq_ref级别通常用于联接,每个索引返回对应数据行,使用主键或唯一索引,效率高。
ref级别使用非唯一索引,返回匹配数据行,涉及回表查询。
range级别索引范围扫描,返回匹配数据行,涉及回表查询。
index级别全索引级别查询,使用场景根据非唯一索引排序查询。
all级别全表查询。
extra参数含义:Using index 只需读取索引行数据,无需回表。
Using where 索引检索后还需执行数据筛选,可创建组合索引。
实际开发过程中sql语句至少要优化到range级别。
(7)如何处理慢sql?
首先开启慢sql监控,通过监控查询出慢sql,然后通过explain执行计划分析。
mysql开启慢日志记录:
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
SET GLOBAL slow_query_log_file = '/path/to/your/slow_query.log';
(8)sql优化?
避免在索引列上进行计算、使用函数、不等于、not in
select查询必要的列
where查询频繁的字段建立索引
缩小子查询的结果
from涉及到多个表时,选择数据最少的为基础表
(9)InnoDB通过什么机制来实现事务支持的?