前言
mysql两大常用存储引擎 MyISAM、InnoDB,其中MyISAM 不支持事务 表锁,不能很好地支持高并发;InnoDB为 MySql5.5之后的默认存储引擎 支持行锁 事务,支持高并发。以下是对学习mysql的笔记
【优化口诀】
全局匹配我最爱,最左前缀要遵守
带头大哥不能死,中间兄弟不能断
索引列上少计算,范围之后全失效
like百分写最右,覆盖索引不写星
不等空值还有 or,索引失效要少用
var 引用不可丢, sql高级也不难
- 性能下降SQL慢 执行时间长 等待时间长原因
- 查询语句写的烂
- 索引失效;一般为单值索引、复合索引
- 关联查询太多join
- 服务器调优及各个参数配置(线程数 缓冲)
- 一般SQL语句执行顺序
- 索引优化分析
是什么?索引是帮助MySql高效获取数据的数据结构。可以得到索引得本质:索引是数据结构。"排好序的快速查找数据结构"。索引本身也很大,不可能存储内存中,索引往往以索引文件的形式存储的磁盘上。索引一般指B树(多路搜索树)。
优势:提高数据检索的效率,降低数据库的IO成本,降低数据排序的成本,降低了CPU的消耗 。
劣势:索引占用一定的物理空间,对于insert update会引起索引变化。
mysql索引分类:单值索引(即一个索引只包含单个列,一个表可以有多个单列索引)
唯一索引(索引 列的值必须是唯一的,但允许有空值)
复合索引(即一个索引可以包含多个列)
哪些情况下需要创建索引?
主键自动建立唯一索引
频繁作为查询条件的字段应该创建索引
查询中与其它表关联字段,外键关系建立索引
频繁更新的字段不适合创建索引-因为每次更新不单单是更新了记录还会更新索引,加重了IO的负担
where条件 里用不到的字段不创建索引
查询中排序的字段,排序字段若通过索引去访问 将大大提高排序速度
哪些情况不需要创建索引?
标记录太少
经常增删改的表(提高查询速度,同时却会降低更新表的速度,如对表进行insert update delete因为更新表时mysql要保存数据,还要保存一下索引文件)
explain分析
是什么?(查看执行计划) | 使用explain关键性可以模拟优化器执行sql查询语句,从而知道mysql是如何处理你的SQL语句的,分析你的查询语句或是表结构的性能瓶颈 |
能干什么? | 表的读取顺序、数据读取操作的操作类型、哪些索引可以使用、哪些索引被实际使用、表之间的引用、每张表有多少行被优化器查询 |
怎么玩? | explain+SQL语句 执行计划包含的信息- |
各种字段解释 | id-- select 查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序 id相同,执行顺序由上至下 id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行 id相同不同 同时存在
select_type--
table --显示这一行的数据是关于哪张表的
|
** 读锁会阻塞写,但是不会阻塞读,而写锁都会阻塞读与写
事务隔离级别详解 https://www.cnblogs.com/catmelo/p/8878961.html
|