Mysql知识点(复习用,待整理)

数据文件:

frm文件存放表结构,myd文件存放表数据,myi文件存放表索引。

查看数据库引擎命令:show engines;

MyISAM 和 InnoDB的对比:
MyISAM不支持主外键,InnoDB支持主外键
MyISAM不支持事物,InnoDB支持事物
MyISAM使用的是表锁,InnoDB使用的是行级锁
MyISAM只缓存索引,不缓存数据,InoDB即缓存索引又缓存数据
MyISAM的表空间小,InnoDB的表空间大
MyISAM的关注点在性能,InnoDB的关注点在事物;

SQL解析:

from on join where group by having select order by limit

索引:

排好序的快速查找数据结构,MySQL默认索引结构是B+Tree;

优点:提高了数据检索的效率,降低了数据库的IO成本
缺点:降低了MySQL的更新速度,既要维护数据表信息,又要维护索引信息

索引种类:

主键索引
唯一索引:索引的列必须唯一,允许有空值;
普通索引:单值索引(一个索引只包含一个列,一个表可以有多个单值索引)、复合索引(一个索引包含多个列);
全文索引:对文本的内容进行分词,进行搜索

索引结构
B-Tree:平衡多路搜索树,它的每个叶子都可以拥有大于等个2个子节点,所以叫多路,是为了降低高度,查询性能提高;
B+Tree: 在B-Tree的基础上改造,它的数据都存在叶子节点,同时叶子节点还加了指针形成链表;

为什么使用B+Tree 而不是红黑树(平衡二叉树)?
因为B+Tree的高度远远小于红黑树。索引文件本身也很大,不可能一次性加载进内存;
索引的结构要尽可能的减少查找过程中磁盘IO的存取次数;

InnoDB

是一个以主键索引来组织数据的存储,具体的数据保存在叶子节点,
而辅助索引中的叶子节点保存了指向主文件的主键关键字。

比如第1块磁盘块里面有P1指针、数据项17、P2指针、数据项35、P3指针, 那么P1指针指向的是小于数据项17的磁盘块2,里面又分为P1指针、数据项8、P2指针、数据项12、P3指针。 那么p2指针指向的是在数据项17和数据项35之间的磁盘块3,里面又分为P1指针、数据项26、P2指针、数据项30、P3指针。 以此类推下去

哪些情况下需要建立索引?
1.主键自动创建唯一索引
2.频繁使用查询的条件
3.表关联的字段
4.频繁更新的字段不适合建立索引

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

Explain:

查看执行计划,用来分析查询语句或表结构的性能瓶颈。

主要有下列字段:
id :select 查询序列号,Id越大优先级越高,越先别执行
type:查询使用了何种类型,最好到最差依次是system>const>eq_ref>ref>range>index>all
possiable_key: 显示可能应用到这张表的索引
key: 实际使用到的索引
rows:大致估算找到所需要的记录需要查找的行数

避免索引失效?

1.全值匹配
2.最佳左前缀法则,查询从索引最左前列开始,且不跳过中间的列
3.不在索引上做任何操作,比如计算、函数
4.不能使用索引中范围右边的列
5.!=会导致索引失效
6.is null 和 is not null 无法使用索引
7.like使用通配符开头索引失效
8.少用or,用它连接时索引失效

慢查询日志?

是mysql提供的一种日志记录,记录响应时间超过阀值的语句,默认的long_query_time = 10;结合explain进行全面分析。

查看是否开启:show variables like '%slow_query_log%';
开启:set global slow_query_log = 1;
查看当前阀值:show variables like '%long_query_time%';
设置阀值:set global long_query_time = 3;

MySQL提供了msyqldumpslow工具进行分析。

show profile?

分析当前会话中sql语句执行的资源消耗情况的工具(默认关闭,并保持15次的运行结果)。

查看是否开启:show variables like 'profiling';
开启:set profiling = on;
查看结果:show profiles;
诊断SQL: show profile cpu,block io for query 查询编号

主从复制?

  1. master将改变记录到二进制日志(binary log);
  2. slave将master的二进制日志拷贝到它的中继日志;
  3. salve重做中继日志中的事件,将改变应用到自己的数据库,mysql的复制是异步且串行化的

锁的分类?

对数据操作的类型:
1.读锁:共享锁,不会阻塞读,但会阻塞写
2.写锁:排他锁,当前写操作没有完成,它会阻断其他写锁和读锁

从粒度分析:
1.表锁:偏向于MyISAM存储引擎,开销小,加锁快,无死锁,锁定力度大,并发度低
2.行锁:偏向InnoDB存储引擎,开销大,加锁慢,有死锁,锁定力度小,并发度高;

锁定一行:for update
eg: select column from table where id=xxx for update

优化建议?
1.尽可能让所有的数据检索都通过索引完成,避免行锁升级为表锁
2.尽可能较少检索条件,避免间隙锁。(set b= xxx where a>1 and a <5);
3.尽可能控制事物大小,减少锁定资源量和时间长度;

查询数据库状态,检查是否有死锁: show Engine InnoDB status;

发布了15 篇原创文章 · 获赞 0 · 访问量 69

猜你喜欢

转载自blog.csdn.net/xrzi2015/article/details/105603511