mysql 点总结
1、mysql默认引擎
mysql-5.1版本之前默认引擎是MyISAM,之后是innoDB
2、mysql 配置文件
二进制日志 log-bin 主从复制
错误日志 log-error 默认关闭、记录警告和错误、启动和关闭详情
查询日志 log :默认关闭,记录查询的sql,开启会降低整体性能
数据文件 /var/lib/mysql frm:存放表结构
myd:存放表数据
myi:存放表索引
相关配置:windows-my.ini Linux-/etc/my.cnf
3、存储引擎
myisam : 表锁、只缓存索引
innodb : 支持主外键,支持事务,行锁,缓存索引和真实数据
<1> MyISAM在执行查询语句(select)前,会自动给涉及的所有表加读锁,在执行增删改操作前,会自动给涉及的表加写锁。
MySQL的表级锁有两种模式:
表共享读锁
表独占写锁
读锁会阻塞写,写锁会阻塞读和写
<2> 行锁
偏向InnoDB存储引擎,开销大,加锁慢,会出现死锁,锁定粒度小,发送锁冲突的概率最低,并发度也最高
当选中某一行时,如果是通过主键或者索引选中的,这个时候是行级锁;如果是通过其它条件选中的,这个时候行级锁会升级成表锁,其它事务无法对当前表进行更新或插入操作
4、索引
MyISAM是非集聚引擎,支持全文索引;不支持事务;它是表级锁;会保存表的具体行数.
InnoDB是集聚引擎,5.6以后才有全文索引;支持事务;它是行级锁;不会保存表的具体行数.
<1>排好序的快速查找的一种数据结构
<2>什么情况下,需要创建索引
(1)主键自动建立唯一索引
(2)频繁作为查询体哦阿健的自读那要创建索引
(3)查询中与其他表关联的字段
(4)查询中排序的字段
(5)查询中统计或者分组的字段
<3>什么情况不创建索引
频繁更新的字段不适合创建索引
where条件里用不到的字段不创建索引
表记录很少的
数据重复且平均分布的字段
<4>单值索引和组合索引的选择问题?
高并发建议组合索引(过滤性做好的字段排在前面
<5>避免索引失效
(1)最佳左前缀法则 : https://www.cnblogs.com/cyhbyw/p/8820369.html
(2)不在索引上做任何操作
(3)存储引擎不能使用索引范围条件右边的列
(4)尽量使用覆盖索引(只查询索引列)!=<>无法使用索引慧导致全表扫描
(5) is null, is not null 也无法使用索引
(6) like '%abc...' 索引失效会导致全表扫描
(7) 字符串 不加单引号 索引失效
(8) 少用 or , 索引失效
<6>查询优化
(1) 小表驱动大表
(2) order by 子句尽量避免fileSore, order by 子句使用索引最左前列,
或者 where 子句与 order by 子句条件组合满足索引最左前列
(3) group by 先排序后分组,遵照最佳左前缀,
where 高于having, 尽量在where中限定条件
-------- 在这里面试官肯定会问,有没有做过sql调优
- 1、使用explain, 查看执行计划;
1.1、能干吗呢
(1)表的读取顺序;
(2)数据读取操作的操作类型;
(3)哪些索引可以使用;
(4)哪些索引实际使用;
(5)表之间的引用;
(6)每张表有多少行被优化器查看
5、分区、分库、分表
查看表分区 SHOW VARIABLES LIKE '%partition%'
range 分区,list 分区
mysql 单表容量不超过500W, 否则要水平拆分
6、行表锁
<1> 查询锁: mysql>show open tables;
<2> 读锁:共享锁 lock table 表名 read;
<3> 写锁:独占锁 lock table 表名 write;
<4> 表锁偏读(myisam)、行锁偏写(innodb)
<5> 表锁分析:
(1)读锁示例: session1 加表1 的读锁
session2 可读, 不能改(排队等待)
session1 不可改,不可改其他表
(2)写锁示例: session1 加表1的写锁
session1 可读写操作
session2 不能读(排队等待)
(3)如何分析表锁定
sql:show status like 'table%';
table_locks_immediate: 产生表级锁定的次数
table_locks_waited: 出现表级别锁定争用而发生等待的次数
总结:读锁会阻塞写,单不会阻塞读;
写锁会把读写都阻塞
<6> 行锁分析
show status like 'innodb_row_lock%'
7、主从复制
slave 会从maaster读取binglong进行数据同步,slave将master的binlog
拷贝到它的中继日志,mysql 的复制是异步且串行化的;
8、数据库隔离级别和实现原理
https://www.jianshu.com/p/05aa6aef105e
https://www.bilibili.com/video/BV1DK4y1C7o7?from=search&seid=2252694201214978095