事务
脏读 事务A读取到了事务B 未提交的内容
幻读 事务A读取到了事务B 提交的新增数据
幻读和脏读有点类似:
脏读 是事务B里面修改了数据
幻读 是事务B里面新增了数据
事务的隔离级别
存储引擎
SQL执行加载顺序
MySQL执行顺序
FROM <left_table>
ON <join_condition>
<join_type> JOIN <right_table>
WHERE <where_condition>
GROUP BY <group_by_list>
HAVING <having_condition>
DISTINCT <select_list>
ORDER BY <order_by_condition>
LIMIT <limit_number>
MYSQL七中join方式
索引是什么
索引优缺点
explain关键字
索引优化
- 要遵循
最左匹配原则
带头大哥不能死,中间兄弟不能断
- 不在索引列上做任何操作
(计算、函数、(自动or手动类型转换))
,会导致索引失效,而转向全表扫描
比如:字符串不加单引号 索引会失效
- 存储引擎不能使用索引中 范围条件 右边 的列
- 避免在查询语句中使用select *
- mysql在使用不等于
(!= or <>)
的时候无法使用索引,会导致全表扫描 -
is null,is not null
也无法使用索引 - like 以通配符开头
('%abc...')
,mysql索引会失效,变成全表扫描
如果非要使用以通配符开头,则最好使用覆盖索引,才能避免回表查询
- 少用
or
关键字,用它连接时会导致索引失效
join语句的优化
- 尽可能减少join语句中的NestedLoop的循环总次数;"永远用小结果集驱动大结果集"
- 优先优化NestedLoop的内层循环(也就是子查询中优先优化嵌套最深的语句)
- 多表关联查询时,索引建在子表(因为主表一定会进行全表扫描)
查询优化
行锁优化建议
- 尽可能让所有数据检索都通过索引来完成,避免无索引 行锁升级为表锁
- 合理设计索引,减小锁的范围(比如缩小间隙锁的范围)
- 尽可能较少检索条件,避免间隙锁
- 尽量控制事务大小,减少锁定资源量和时间长度
- 尽可能降低 事务的隔离级别