最新阿里MySQL面试题目45道,以及学习路线分享! -
2018最新mysql数据库优化面试 mysql索引面试 MySQL搜索引擎面试 MySQL面试基础知识 -
MySQL 有哪些存储引擎啊?都有什么区别?
Float、Decimal 存储金额的区别?
浮点数计算都不准(只要不是2的整数倍都会有问题),decimal存储其实是string类型存储。
Datetime、Timestamp 存储时间的区别?
对于TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。
而对于DATETIME,不做任何改变,基本上是原样输入和输出。
对于跨时区的业务,TIMESTAMP更为合适。
Char、Varchar、Varbinary 存储字符的区别?
char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。
如果需要存储的字符串的长度跟所有值的平均长度相差不大(定值),适合用char。
对于经常改变的值,char优于varchar,原因是固定长度的行不容易产生碎片。
对于很短的列,char优于varchar,原因是varchar需要额外一个或两个字节存储字符串的长度。
varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储
binary保存二进制字符串,它保存的是字节而不是字符,没有字符集限制
binary(8)可以保存8个字符,每个字符占1个字节,共占8个字节(01串)
什么是索引?
柱面 磁道 扇面 id +addr
对比一下B+树索引和 Hash索引?
范围搜索 定值搜索速度快
MySQL索引类型有?
唯一索引:加速查询 + 列值唯一(可以有null)
主键索引:加速查询 + 列值唯一(不可以有null)+ 表中只有一个
组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并
如何管理 MySQL索引?
#mysql索引的管理
/*
索引是针对数据所建立的目录
作用:可以加快查询速度
负面影响:降低了增删改的速度
*/
/*
案例:
假设有新闻表,15列,其中10列上有索引,共有100万行数据,如何快速导入
1.把空表的索引全部删除
2.导入数据
3.数据导入完毕后,集中建索引
*/
/*
索引的创建原则
1.不要过度索引
2.在where条件最频繁的列上加
3.尽量索引散列值,过于集中的值加索引,意义不大
*/
/*
索引文件比数据文件大是很常见的,所以不要滥用索引
*/
/*
索引的类型
1.普通索引(INDEX) 仅仅是加快查询速度
2.唯一索引(UNIQUE INDEX) 行上的值不能重复
3.主键索引(PRIMARY KEY) 不能重复
主键必唯一,但是唯一索引不一定是主键
一张表上,只能有一个主键,但是可以有一个或多个唯一索引
4.全文索引(FULLTEXT INDEX) FULLTEXT索引仅可用于MyISAM表
*/
#查看一张表上的所有索引
SHOW INDEX FROM book;
SHOW KEYS FROM book;
#在mysql的dos窗口中,使用如下sql语句,显示数据的时候更方便看
#SHOW INDEX FROM book\G
#EXPLAIN语句可以用作DESC(DESCRIBE)的一个同义词,以下效果相同
EXPLAIN book;
DESC book;
DESCRIBE book;
/*
ALTER TABLE 表名 ADD INDEX /UNIQUE/FULLTEXT[索引名](列名)
ALTER TABLE 表名 ADD PRIMARY KEY(列名) 不要加索引名,因为主键只有一个
*/
对Explain参数及重要参数的理解?
type index extra
索引利弊是什么及索引分类?
主键 唯一 单列 ·
二叉树的转置是什么?
聚簇索引和非聚簇索引的区别?
主键列P_no会自动创建聚集索引,一个表中最多只能存在一个聚集索引,所以如果在别的列上建,原来的这个必须删除,或者改为非聚集。CREATE CLUSTERED INDEX fact_idx ON Salary (fact);
B+tree 如何进行优化?索引遵循哪些原则?存储引擎会进行哪些自动优化?到底何时索引会失效?
索引会失效的原因分析及解决索引失效的方法
表中字段建立索引应该遵循几个原则:
1)越小的数据类型通常更好:越小的数据类型通常在磁盘、内存中都需要更少的空间,处理起来更快。
2)简单的数据类型更好:整型数据比起字符,处理开销更小,因为字符串的比较更复杂,处理起来也更耗时。
3)尽量避免NULL:应该指定列为NOT NULL。含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值。
4)对非唯一的字段,例如“性别”这种大量重复值的字段,增加索引也没有什么意义,所以索引的建立应当更多的选取唯一性更高的字段。
--------------------------------------------
树的高度设置为3 经常使用,散列。
索引与锁有什么关系?
没有建立索引的话我们在进行数据选取或者定位的时候是通过全表扫描的形式来进行的,比如存在这样一张表user(id,name,phone,address);并且这张表中并没有任何索引,那么sql:delete from user where name='张三' 这样一个语句是如何定义到张三这个记录的,因为没有索引,所以在数据库实现的时候是对整张表进行扫描的,那么数据库是不是会把整张表锁定起来。
在mysql中的锁看起来是很复杂的,因为有一大堆的东西和名词:排它锁,共享锁,表锁,页锁,间隙锁,意向排它锁,意向共享锁,行锁,读锁,写锁,乐观锁,悲观锁,死锁。这些名词有的博客又直接写锁的英文的简写--->X锁,S锁,IS锁,IX锁,MMVC...
对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)
MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预
数据库事务有不同的隔离级别,不同的隔离级别对锁的使用是不同的,锁的应用最终导致不同事务的隔离级别
MVCC(Multi-Version Concurrency Control)多版本并发控制,可以简单地认为:MVCC就是行级锁的一个变种(升级版)。
事务的隔离级别就是通过锁的机制来实现,只不过隐藏了加锁细节
在表锁中我们读写是阻塞的,基于提升并发性能的考虑,MVCC一般读写是不阻塞的(所以说MVCC很多情况下避免了加锁的操作)
MVCC实现的读写不阻塞正如其名:多版本并发控制--->通过一定机制生成一个数据请求时间点的一致性数据快照(Snapshot),并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看,好像是数据库可以提供同一数据的多个版本。
快照有两个级别:
索引和锁 - ______Smileヾ淡莣丶 - 博客园
还有什么其他的索引类型,各自索引有哪些优缺点?
MySQL事务和锁有关问题
谈谈对Innodb事务的理解?
说说数据库事务特点及潜在问题?
数据库事务的四大特性
什么是MySQL隔离级别?
4
有多少种事务失效的场景,如何解决?
https://blog.csdn.net/qq_27101653/article/details/81296988
一致性非锁定读和一致性锁定读是什么?
Innodb如何解决幻读?
讲讲Innodb行锁?
死锁及监控是什么?
自增长与锁 ,锁的算法,锁问题,锁升级是什么?
乐观锁的线程如何做失败补偿?
高并发场景(领红包)如何防止死锁,保证数据一致性?
谈谈MySQL的锁并发?
MySQL性能优化有关问题
回表和集群因子是什么?
讲讲表与表之间的关系?
了解查询优化器模块;
查询优化的基本思路是什么?
说说MySQL读写分离、分库分表?
Query语句对数据库性能有什么影响?
Schema设计对系统性能有什么影响?
硬件环境对数据库的性能有什么影响?
表结构对性能有什么影响?
浅谈索引优化?
JOIN的原理是什么?
说说Sql优化的几点原则?
MySQL表设计及规范?
说说MySQL几种存储引擎应用场景?
MySQL常用优化方式有哪些?
MySQL常用监控?
Druid集成 +监控页面 -
MySQL瓶颈分析?
MySQL的系统学习方法
innerdb4大特性
一:插入缓冲
insert buffer
二:二次写
当操作系统或者数据库进程在数据页写磁盘的过程中崩溃,Innodb可以在doublewrite缓存中找到数据页的备份而用来执行crash恢复。当写入失效发生时,先通过页的副本来还原该页,再进行重做,这就是double write 。他其实就是建立了一个副本。
三:自适应哈希
B+树的查找次数,取决于B+树的高度,在生产环境中,B+树的高度一般3-4层,故需要3-4次的查询,经常访问的二级索引数据会自动被生成到hash索引里面去。在一般情况下这种查找的时间复杂度为O(1)。会占用innodb buffer pool
四:预读
当进行分页操作的时候他会读取现有的page,将page设置到8,当下一个页面进来以后超过8这个阈值就会预先加载到buffer pool中。
select count(*)哪个更快,为什么
myisam更快,因为myisam内部维护了一个计数器,可以直接调取。
堆表
https://www.baidu.com/link?url=l1rzjeVlwp2JdESbiKqHi2vlckAcX9T4v8PIird8WTYJ_hQbsUMWDURX1-d0S05o8DYVXlj6dkXhHmGbsV7c9_&wd=&eqid=d977106300002d85000000045d1f0cea
innodb的事务与日志的实现方式
(1)、有多少种日志
redo和undo
(2)、日志的存放形式
redo:在页修改的时候,先写到 redo log buffer 里面, 然后写到 redo log 的文件系统缓存里面(fwrite),然后再同步到磁盘文件( fsync)。
Undo:在 MySQL5.5之前, undo 只能存放在 ibdata*文件里面,5.6 之后,可以通过设置 innodb_undo_tablespaces 参数把 undo log 存放在 ibdata*之外。
(3)、事务是如何通过日志来实现的,说得越深入越好
基本流程如下:
因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的
状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。
备份计划,mysqldump以及xtranbackup的实现原理
mysqldump 100G以内 一天
xtranbackup 100G以上 一周
drop,delete与truncate的区别
drop直接删掉表 truncate删除表中数据,再插入时自增长id又从1开始 delete删除表中数据
当表被TRUNCATE 后,这个表和索引所占用的空间会恢复到初始大小,而DELETE操作不会减少表或索引所占用的空间。drop语句将表所占用的空间全释放掉。
MySQL数据库单表的数据量大的情况
设计良好的数据库结构,允许部分数据冗余
mysql库主从读写分离。
找规律分表,减少单表中的数据量
添加缓存机制,比如memcached,apc等。
char和varchar的区别?
char 定长(小于用空格补齐) varchar 不定长