如果有很多数据插入MYSQL 你会选择什么方式?
存储过程
如果查询很慢,你会想到的第一个方式是什么?索引是干嘛的?
索引,增加查询速率
如果建了一个单列索引,查询的时候查出2列,会用到这个单列索引吗?
能
如果建了一个包含多个列的索引,查询的时候只用了第一列,能不能用上这个索引?查三列呢?
能,能
接上题,如果where条件后面带有一个 i + 5 < 100 会使用到这个索引吗?
不会
应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描
怎么看是否用到了了某个索引?
explain
like %aaa%会使用索引吗? like aaa%呢?
不会,不会使用,(但不会使索引失效)
drop、truncate、delete的区别?
1.速率drop > truncate > delete
drop是DDL,会隐式提交,所以,不能回滚,不会触发触发器。
drop语句删除表结构及所有数据,并将表所占用的空间全部释放
truncate是DDL,会隐式提交,所以,不能回滚,不会触发触发器
truncate会删除表中所有记录
delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(commit)操作才能生效,可以通过rollback撤消操作。
平时你们是怎么监控数据库的? 慢SQL是怎么排查的?
触发器;线上慢查询的排查
你们数据库是否支持emoji表情,如果不支持,如何操作?
不支持,编码utf8mb4
你们的数据库单表数据量是多少?一般多大的时候开始出现查询性能急剧下降?
某些表数据达到500W+以后查询统计性能严重下降
查询死掉了,想要找出执行的查询进程用什么命令?找出来之后一般你会干嘛?
SELECT * FROM information_schema.PROCESSLIST where COMMAND = 'Query';
检查是否有死进程
SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;
kill 进程号
重新执行
读写分离是怎么做的?你认为中间件会怎么来操作?这样操作跟事务有什么关系?
让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作
MySQLProxy实际上是在客户端请求与MySQLServer之间建立了一个连接池。所有客户端请求都是发向MySQLProxy,然后经由MySQLProxy进行相应的分析,判断出是读操作还是写操作,分发至对应的MySQLServer上
分库分表有没有做过?线上的迁移过程是怎么样的?如何确定数据是正确的?
附:
为什么SQL第一次查慢,第二次查快?
是一个内存常驻的问题,
但是实际上是表缺少索引,你在where,order by列添加索引 就不会有这种情况了。
产生的原因可能:你的表行数很多,由于没有添加索引,需要进行全表扫描,第一次需要从物理磁盘中将全表加载到内存中,很慢。第二次因为全表在内存中 所以查找很快。
如果添加了索引的话,就不需要全表扫描,即使第一次也不需要加载全表数据
索引优点
1.大大加快数据的检索速度;
2.创建唯一性索引,保证数据库表中每一行数据的唯一性;
3.加速表和表之间的连接;
4.在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间。
索引缺点
1.索引需要占物理空间。
2.当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度。