Mysql高级
逻辑架构
- 连接层
- 服务层
- 引擎层
- 存储层
存储引擎

join查询
- inner join
- left join
- right join
索引
索引的目的在于提高查询效率
是排好序的快速查找数据结构
索引没有特别指明,都是指B树(多路搜索树,不一定是二叉的),唯一索引默认都是B+树。还有hash索引等。
索引的优势:
- 提高数据检索的效率
- 降低数据排序的成本
劣势: - 索引占用空间
- 降低更新表的速度
- 要花时间建立更优秀的索引
索引分类
- 单值索引
- 唯一索引
- 复合索引
- 基本语法{
创建:CREATE [UNIQUE] INDEX indexname ON mytable(columnname(length));
ALTER mytable ADD [UNIQUE] INDEX indexname ON columnname(length);
删除:DROP INDEX[indexname] ON mytable;
查看:SHOW INDEX FROM table_name\G
}
explain
能干嘛:

- id
- select_type
- table
- type{
ALL index range ref eq_ref const sytem NULL
访问类型排列
显示查询使用了何种类型
从最好到最差依次是:
system>const>eq_ref>ref>range>inde>ALL
} - possible_keys
- key
- key_len
- ref
- rows
- Extra
索引优化
索引失效的原因

查询截取分析
查询优化
-
小表驱动大表
A表大于B表A in B;
A表小于B表A exists B -
ORDER BY优化
- 使用index,不用filesort(需要符合最佳左前缀原则)
- 避免单路排序失效
- 增大sort_buffer_size参数的设置
- 增大max_length_for_sort_data参数的设置
-
GROUP BY优化
- 同ORDER BY
- 能用where不用having
慢查询日志
show profile
全局查询日志
Mysql锁机制
- 表锁(偏读):读锁会阻塞写,但是不会阻塞读,写锁会把读和写都阻塞。
- 行锁(偏写):无索引行锁升级为表锁
InnoDB与MyISAM的最大不同有两点:一是支持事务;二是采用了行级锁。
事务及其ACID属性:

并发事务处理带来的问题:- 更新丢失
- 脏读:事务A读取到了事务B已修改但尚未提交的数据
- 不可重复读:事务A读取到了事务B已提交的修改数据,不符合隔离性
- 幻读:事务B里新增了数据

Mysql事务隔离级别默认为可重复读
间隙锁:查询过程通过范围查找的话,他会锁定整个范围内的所有的索引键值,即使这个键值并不存在。
面试题:如何锁定一行?加for update

- 页锁
主从复制


浙公网安备 33010602011771号