导图社区 mysql
发一些个人学习的积累及自己遇到的面试题,有需要的同学可以参考一下。受个人能力的影响,若有错误欢迎提出来大家讨论。
提示: 本内容由社区用户上传并分享。平台不对内容的真实性、合法性、知识产权归属及是否侵害第三方权利进行事前审核或保证。本内容可能包含受版权保护的图片、字体或其他第三方素材,使用前请自行确认授权范围。
社区模板帮助中心,点此进入>>
数据库思维导图
MySQL基础
数据库
极客时间:MySQL必知必会
Mysql45讲-逐步更新
MySQL
mysql函数
MySQL数据库
My SQL
MySQL入门JavaScript知识点自学
mysql
数据量过大,mysql应该怎么优化?
1.采用索引。2.尽可能减少多表查询,采用单表查询。3.避免一次查询所有列。4.避免使用外键。5.流量大的模块还可以加如redis这样的内存数据库缓存。6.可以使用连接池。7.还可以使用分库分表。
怎么防止sql注入?
通过预编译的方式解决。之所以会产生sql注入是sql语言把单引号当做有意义的符号来处理。预编译后把整体参数传入。执行的变量不在是单引号,而是问号做占位符,这样执行不会产生结果,防止了sql注入带入数据泄露。
#{}是预编译,可以将传入参数的整体做参数去执行,避免了sql注入。${}是原样传值。
mysql存储容量
单表4G,最大表空间64T。
补充
单表4G(4G大概2000W条数据,5000W条记录10G),表空间最大64T。使用InnoDb引擎。
你项目DAU 50W,有多大的数据量?
50W数据大概就是100M。
一张表有1,2,3三行,另一张表有三行1,用内连接是几行?用外连接是几行?
内连接是三行,外连接是五行。
怎么防止超卖?
1.要么加锁。2.要么sql语句加条件库存数量大于0。
我现在有一张表里有1000W数据,里面有个模糊查询,怎么做优化?
1.确保查询列有索引。
2.不要把所有列查出来,避免IO时间过久。
3.使用like 前缀查询,如like 'prefix%'。like查询不用前缀查询是不走索引走全表扫描。用前缀查询走的是range级别的范围索引,用%keyword%走的是all的级别。
4.使用执行计划。
5.确实有必要可以改成分库分表。
听说过脏读,幻读,不可重复读吗?
脏读:就是一个事务读了另一个事务没有提交的数据。解决办法。将事务的隔离级别改为读已提交。
不可重复读:指的是一个事务在读数据,另一个事务在修改数据,导致两次读到的数据不一致。解决办法加行锁。在修改时不允许读。
幻读:指一个中务在读数据,另一个事务在新增或是删除多条数据,导致这个事务两次读到的不一致。解决办法加表锁。
幻读锁表具体怎么做?
用lock table 表名 read

幻读除了用表锁还有什么办法?
间隙锁。
mysql的隔离级别
1.读未提交。会产生脏读,不可重复读,幻读。
2.读已提交。不会产生脏读,会产生不可重复读,幻读。
3.可重复读。不会产生脏读,不可重复读,会产生幻读。
4.序列化。其实就是一条一条的读。加了锁。不会产生脏读,不可重复读,幻读。
mysql默认的隔离级别是什么?
可重复读
什么是undo,什么是redo?
undo用于回滚保证事务的一致性是原始数据的备份,redo用于重做保证事务的持久性是原始数据的修改。事务执行前将数据拷贝到undo日志,执行的update,delete会在 redo执行。执行成功会 redo日志同步到数据库文件。
B树与B+树
mysql的存储结构为什么用B+树而不是B树?
1.B+树叶子结点存数据和索引。非叶子节点存索引与地址,减小了树的深度,提高了遍历的速度。
2.B+的时间复杂度是O(logN),而B树随着节点的增加在增加。
B树与B+树的结构?
B树是树枝节点存数据也存索引,而B+树是树枝节点存索引,叶子结节只存数据。降低了树的深度。IO速度更快。
说一说数据库的表锁与行锁在什么情况下会产生死锁?
表锁产生死锁,当使用表锁后没有调用unlock tables来释放锁,就会使锁产生死锁。
相互持有对方想要的锁且彼此没释放锁就会产生死锁。比如A用户锁住表A,B用户锁住表B,现在A想要表B的数据,用户B想要表A的数据,彼此想要对方的数据,彼此持有的锁也没释放,就会产生死锁。
mysql除了表锁行锁外还有什么锁?
乐观锁其实就是版本机制,也就是在表里增加一列,该列每次成功修改值加1,修改时要提供数据库目前的版本值才能修改成功,这个原理和并发编程里的CAS其实很类似,只不过一个环境是在内存,一个是在mysql数据库。
执行计划看哪些参数?
主要关注type参数, 其中值为all-表示全表扫秒,效率低。range-表示按范围扫描。const-表示按主键扫描。index-表示全索引扫描。system-表示查询系统表。
为什么mysql当进行where id=15后再查询were id=20会更快?
因为缓冲区。
mysql里order_id='"+orid+"'与order_id='?'有什么不同?
order_id='"+orid+"'会产生sql注入的风险,order_id='?'采用了预编译,不会产生sql注入。
B+树
一颗B+树有多少层?
不超过4层。
3层可存10亿数据。
有没有了解过mysql的监控机制,比如慢查询?
1.慢查询日志可以在mysql的配置文件设置。2.使用执行计划。
说说mysql的mvcc?
MVCC(Multi Version Concurrency Control)多版本并发控制。通过创建多个非锁写的版本来实现。
给数据库存abc,除了存了abc还存了什么以?三个隐藏字段是什么?
1.事务id(DB-TRX_ID)
2.回滚指针。(DB_ROLL_ID)
3.行id。(DB_ROW_ID)
mysql事务的ACID指的是什么?
A (Atomicity)是原子性。
C(Consistency)是一致性。
I(Isolation)是隔离性。
D(Durability)是持久性。
主题