数据量过大,mysql应该怎么优化?
1.采用索引。2.尽可能减少多表查询,采用单表查询。3.避免一次查询所有列。4.避免使用外键。5.流量大的模块还可以加如redis这样的内存数据库缓存。6.可以使用连接池。7.还可以使用分库分表。
怎么防止sql注入?
通过预编译的方式解决。之所以会产生sql注入是sql语言把单引号当做有意义的符号来处理。预编译后把整体参数传入。执行的变量不在是单引号,而是问号做占位符,这样执行不会产生结果,防止了sql注入带入数据泄露。
#{}是预编译,可以将传入参数的整体做参数去执行,避免了sql注入。${}是原样传值。
mysql存储容量
补充
单表4G(4G大概2000W条数据,5000W条记录10G),表空间最大64T。使用InnoDb引擎。
一张表有1,2,3三行,另一张表有三行1,用内连接是几行?用外连接是几行?
怎么防止超卖?
1.要么加锁。2.要么sql语句加条件库存数量大于0。
我现在有一张表里有1000W数据,里面有个模糊查询,怎么做优化?
3.使用like 前缀查询,如like 'prefix%'。like查询不用前缀查询是不走索引走全表扫描。用前缀查询走的是range级别的范围索引,用%keyword%走的是all的级别。
听说过脏读,幻读,不可重复读吗?
脏读:就是一个事务读了另一个事务没有提交的数据。解决办法。将事务的隔离级别改为读已提交。
不可重复读:指的是一个事务在读数据,另一个事务在修改数据,导致两次读到的数据不一致。解决办法加行锁。在修改时不允许读。
幻读:指一个中务在读数据,另一个事务在新增或是删除多条数据,导致这个事务两次读到的不一致。解决办法加表锁。
mysql的隔离级别
2.读已提交。不会产生脏读,会产生不可重复读,幻读。
3.可重复读。不会产生脏读,不可重复读,会产生幻读。
4.序列化。其实就是一条一条的读。加了锁。不会产生脏读,不可重复读,幻读。
什么是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注入。
有没有了解过mysql的监控机制,比如慢查询?
1.慢查询日志可以在mysql的配置文件设置。2.使用执行计划。
说说mysql的mvcc?
MVCC(Multi Version Concurrency Control)多版本并发控制。通过创建多个非锁写的版本来实现。
给数据库存abc,除了存了abc还存了什么以?三个隐藏字段是什么?