Mysql高级

定义:排好序的快速查找数据结构。
目的:在于提高查询的效率,可以类比字典
优势:
a.提高数据检索的效率,降低数据库的IO成本
b.降低数据排序的成本,降低了CPU的消耗
劣势:降低了更新表的速度

索引分类:
1.单值索引:一个索引只包含单个列,一个表可以有多个单列索引
2.唯一索引:索引列的值必须唯一,但允许有空值
3.复合索引:一个索引包含多个列

MySQL索引结构:
BTree索引
Hash索引
full-text全文索引
R-Tree索引

创建索引的情况:
1.主键自动建立唯一索引
2.频繁作为查询条件的字段应该创建索引
3.查询中与其他表关联的字段,外键关系建立索引

不创建索引的情况:
1.表记录太少
2.经常增删改的表

EXPLAIN:使用EXPLAIN关键字可以模拟优化器执行SQL查询语句
作用:
1.表的读取顺序
2.数据读取操作的操作类型
3.哪些索引可以使用
4.哪些索引被实际使用
5.表之间的引用
6.每张表有多少行被优化器查询

id:表示查询中执行select子句或操作表的顺序
a.id相同,执行顺序由上至下
b.id不同,id越大优先级越高,越先被执行
c.id相同不同同时存在
select_type:
1.simple:简单的select查询,查询中不包含子查询或者union
2.primary:查询中若包含任何复杂的子部分,最外层查询标记为
3.subquery:在select或者where列表中包含了子查询
4.derived:在from列表中包含的子查询被标记为derived(衍生)
MySQL会递归执行这些子查询,把结果放在临时表里
5.union:若第二个select出现在union之后,则被标记为union
若union包含在from子句的子查询中,外层select被标记为derived
6.union result:从union表获取结果的select

type:system>const>eq_ref>ref>range>index>all
possible_keys:可能会用到的索引
key:实际用到的 索引
key_len:索引中使用的字节数
ref:索引的唯一列被使用了
rows:有多少行被优化器查询
extra:重要的额外信息
1.using filesort:使用了外部排序(九死一生)
2.using temporary:使用了临时表进行排序(十死无生)
3.using index :使用了覆盖索引(存在using where 执行查找动作 否 只用来读取数据)

索引失效的情况:
Mysql高级_第1张图片

索引优化口诀:
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写右边,覆盖索引不写星;
不等控制还有or, 索引失效要少用;
VAR引号不可丢,SQL高级也不难;

MySQL优化总结:
1.慢查询的开启并捕获
2.explain+慢SQL分析
3.show profile查询SQL在Mysql服务器里面的执行细节和生命周期情况
4.SQL数据库服务器的参数调优

小表驱动大表:
当A表的数据集小于B表的数据集时,用exists优于in
select * from A where exists(select 1 from B where B.id = A.id)

order by排序的情况:
Mysql高级_第2张图片

mysqldumpslow工具使用帮助:
Mysql高级_第3张图片

Mysql高级_第4张图片

使用show profile 出现的问题情况:
1.converting HEAP to MyISAM:查询结果太大了,内存不够用,往磁盘上搬了
2.Creating tmp table:创建临时表
3.Copying to tmp table on disk:把内存中临时表复制到磁盘
4.locked

Mysql表锁:
Mysql高级_第5张图片

简而言之,就是读锁会 阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞

innodb支持事务和行锁
Mysql高级_第6张图片

并发事务处理所带来的问题:
1.更新丢失
2.脏读
3.不可重复读
4.幻读

事务隔离级别:
Mysql高级_第7张图片

查看表锁的状态:show status like ‘innodb_row_lock%’;
添加表锁:begin; select ….. for update;

mysql主从复制

你可能感兴趣的:(数据库)