1.mysql语句执行的步骤
2.mysql有哪几种锁
3.mysql中不同的表格
4.myisam和innodb的区别
myisam
innodb
5.四种隔离级别
6.mysql数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化?
7.锁的优化策略
不能将锁的粒度过于细化,不然可能会出现线程的加锁和释放次数过多,反而效率不如一次加一把大锁
8.索引的底层实现原理和优化
B+树。主要是在所有叶子结点中增加了指向下一个叶子节点的指针,使用默认自增的主键作为主索引。
索引常见底层数据结构
哈希表,有序数据组,搜索树
索引类型
innodb B+树索引
考虑因素:
选择原因
9.覆盖索引和索引下推
10.索引失效
11…优化mysql
12.优化数据库
13.索引,主键,唯一索引,联合索引区别,对数据库性能有什么影响
索引是一种特殊的文件,包含对数据表里所有记录的引用指针。
索引可以极大的提高数据的查询速度,但会降低插入、删除、更新表的速度,因此在执行这些写操作时,还要操作索引文件。
14.数据库事务
特性:原子性,一致性,隔离性,持久性
15.索引:
16.mysql外连接,内连接,自连接区别
交叉连接:笛卡尔积,不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配
内连接:只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,内连接只连接匹配的行
外连接:结果集中不仅包含符合连接条件的行,而且还会包含左表,右表或两个表中的所有数据行,依次称
17.数据完整性指数据的精确性和可靠性
与表有关的约束为:包括列约束(not null) 表约束(primary key,foreign key,check,unique)
18.视图,游标
视图:一种虚拟的表,具有和物理表相同的功能,可以对视图进行增,改,查,操作,视图通常是有一个表或者多个表的行或列的子集,对视图的修改不影响基本表,使得我们获取数据更容易
游标:是对查询出来的结果集作为一个单元来有效的处理,游标可以定在该单元中的特定行,从结果集的当前行检索一行或多行,可以对结果集当前行做修改。一般不使用游标,但是需要逐条处理数据的时候,游标很重要。
19.存储过程
存储过程是一个预编译的sql语句,优点是允许模块化设计,只需要创建一次,以后在该程序中就可以调用多次,如果某次操作需要执行多次sql,使用存储过程比单纯sql语句执行要快,可以用一个命令对象来调用存储过程。
20.基本表,视图
基本表是本身独立存在的表,在sql中一个关系就对应一个表
视图是从一个或几个基本表导出的表,视图本身不独立存储在数据库中,是一个虚表
21.视图优点
22主键,外键,索引
23sql优化
InnoDB 存储引擎的默认索引实现为:B+ 树索引。
使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页。如果使用非自增主键(如果身份证号或学号等),由于每次插入主键的值近似于随机,因此每次新纪录都要被插到现有索引页得中间某个位置, 频繁的移动、分页操作造成了大量的碎片,得到了不够紧凑的索引结构,后续不得不通过OPTIMIZE TABLE(optimize table)来重建表并优化填充页面。
聚簇索引就是按照每张表的 主键 构造一棵B+树,同时叶子节点中存放的就是整张表的行记录数据。
在 InnoDB 中,只有主键索引是聚簇索引,如果没有主键,则挑选一个唯一键建立聚簇索引。如果没有唯一键,则MySQL自动为InnoDB表生成一个隐含字段来建立聚簇索引,这个字段长度为6个字节,类型为长整形。
当查询使用聚簇索引时,在对应的叶子节点,可以获取到整行数据,因此不用再次进行回表查询。
根据主键索引搜索时,直到找到key所在的节点即可取出数据,根据辅助索引查找时,则需要先取出主键的值,再走一遍主索引。
非聚簇索引不一定会回表查询,如果查询语句全部命中索引,则不必再进行回表查询
使用b+树原因:B+树只要遍历叶子节点就可以实现整棵树的遍历,而且在数据库中基于范围的查询是非常频繁的,而B树只能中序遍历所有节点,效率太低。
用explain命令查看语句的执行计划,mysql执行语句前会将该语句过一遍查询优化器,之后会拿到对语句的分析,即执行计划,其中包含许多信息,可以通过其中和索引相关的信息来分析是否命中了索引。
创建了索引但查询是并没有使用的情况
事务回滚机制:
恢复机制是通过回滚日志(undo log)实现的,所有事务进行的修改都会先记录到这个回滚日志中,然后在对数据库中的对应行进行写入。当事务已经被提交之后,就无法再次回滚了。
ROLLBACK
时提供回滚相关的信息不可重复读的重点是修改,幻读的重点在于新增或者删除。
innodb默认支持repeatable-read(可重复读)加锁算法可以避免幻读产生
按锁粒度分:
按使用方式分:
按思想分:
存储引擎有几种锁算法
死锁
insert into tab(xx,xx) on duplicate key update xx=‘xx’
。innodblockwait_timeout
来设置超时时间,一直等待直到超时innodblockwait_timeout
设置的时长是50sinnodbdeadlockdetect
设置为on可以主动检测死锁,在innodb中这个值默认就是on开启的状态1.客户端请求->
2.连接器(验证用户身份,给予权限) ->
3.查询缓存(存在缓存则直接返回,不存在则执行后续操作)->
4.分析器(对SQL进行词法分析和语法分析操作) ->
5.优化器(主要对执行的sql优化选择最优的执行方案方法) ->
6.执行器(执行时会先看用户是否有执行权限,有才去使用这个引擎提供的接口)->
7.去引擎层获取数据返回(如果开启查询缓存则会缓存查询结果)
Drop、Delete与Truncate的共同点和区别
排查过程:
处理
kill 掉这些线程(同时观察 cpu 使用率是否下降)
进行相应的调整(比如说加索引、改 sql、改内存参数)
重新跑这些 SQL。
主从复制五个步骤
主从同步延迟的原因:
一个服务器开放N个链接给客户端来连接的,会有大并发的更新操作, 但从服务器的里面读取binlog的线程仅有一个,当某个SQL在从服务器上执行的时间稍长 或者由于某个SQL要进行锁表就会导致,主服务器的SQL大量积压,未被同步到从服务器里。这就导致了主从不一致, 也就是主从延迟。
主从同步延迟的解决办法:
主服务器要负责更新操作,对安全性的要求比从服务器要高,所以有些设置参数可以修改,比如sync_binlog=1,innodb_flush_log_at_trx_commit = 1 之类的设置等。
选择更好的硬件设备作为slave。
把一台从服务器当度作为备份使用, 而不提供查询, 那边他的负载下来了, 执行relay log 里面的SQL效率自然就高了。
增加从服务器,这个目的还是分散读的压力,从而降低服务器负载。
分库分表
水平分库:以字段为依据,按照一定策略(hash、range等),将一个库中的数据拆分到多个库中。
水平分表:以字段为依据,按照一定策略(hash、range等),将一个表中的数据拆分到多个表中。
垂直分库:以表为依据,按照业务归属不同,将不同的表拆分到不同的库中。
垂直分表:以字段为依据,按照字段的活跃性,将表中字段拆到不同的表(主表和扩展表)中。
分库分表中间件:sharding-jdbc、mycat
分库分表的问题:
事务问题:需要用分布式事务
跨节点Join的问题:解决这一问题可以分两次查询实现
跨节点的count,order by,group by以及聚合函数问题:分别在各个节点上得到结果后在应用程序端进行合并。
数据迁移,容量规划,扩容等问题
ID问题:数据库被切分后,不能再依赖数据库自身的主键生成机制,最简单可以考虑UUID
跨分片的排序分页问题
执行效率上:
列名为主键,count(列名)会比count(1)快
列名不为主键,count(1)会比count(列名)快
如果表多个列并且没有主键,则 count(1) 的执行效率优于 count()
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count()最优。
表结构优化
查询优化
索引优化
慢查询优化