MYSQLzhis
2020-10-24 17:35:50 25 举报
AI智能生成
MYSQL
作者其他创作
大纲/内容
优化
InnoDB锁
InnoDB事务
事务隔离级别
Read Uncommitted
读未提交,啥也没解决
Read Committed
读已提交,可以解决脏读,但没解决不可重复读和幻读
Repateable Read(默认)
重复读,可以解决脏读,不可重复读。Mysql在RR级别的实现中禁止了幻读发生
Serializable
串行,性能极低
MVCC原理
概念
两个或三个隐藏的ID
DATA_TRX_ID事务id
DATA_ROLL_PTR回滚指针
指向修改前版本的DATA_ROLL_PTR指针
DB_ROW_ID行标识(如果表没有主键)
MVCC只是在普通的SELELCT查询时生效
在事务隔离级别为 Read Committed 和 Repateable Read 下运行
举例说明
创建个表
插入两条数据
SELECT 对 INSERT
SELECT 对 UPDATE
SELECT 对 DELETE
存储引擎
InnoDB
优点
支持并发事务,支持并默认开启行级锁
Mylsam
优点
性能极佳,很适合读密集场景
缺点
不支持事务和行级锁,数据库奔溃后无法安全恢复,不支持MVCC
InnoDB索引
索引未生效,该如何排查
Explain
索引失效情况举例
索引一般加在哪些字段
多列索引顺序的选择
InnoDB支持的索引类型
B+tree
Hash
综合问题
一条sql执行很慢,会是什么原因?
大多数情况正常,偶尔很慢
redolog刷脏页中,因为写满了,要去同步磁盘
遇到了表锁或行锁,等待中
一直很慢
索引未生效,查看Expain的type
存储引擎选错索引,引擎认为走全表扫描比走所以快,导致全表扫描了
如何优化查询
在表中建立索引,优先考虑where、group by使用到的字段。
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
尽量避免使用select *,返回无用的字段会降低查询效率。
尽量避免使用in 和not in,会导致数据库引擎放弃索引进行全表扫描。
尽量避免使用or,会导致数据库引擎放弃索引进行全表扫描。
尽量避免在字段开头模糊查询,会导致数据库引擎放弃索引进行全表扫描。
尽量避免进行null值的判断,会导致数据库引擎放弃索引进行全表扫描。
尽量避免在where条件中等号的左侧进行表达式、函数操作,会导致数据库引擎放弃索引进行全表扫描。
当数据量大时,避免使用where 1=1的条件。通常为了方便拼装查询条件,我们会默认使用该条件,数据库引擎会放弃索引进行全表扫描。
0 条评论
下一页
为你推荐
查看更多
抱歉,暂无相关内容