数据库优化,这几种情况不是简单加索引就能解决的

在平时的工作中,在对公司慢查询日志做优化的时候,很多时候可能是忘了建索引,这时候很简单,加个索引就行了。但是有几种情况就不是简单加索引能解决了:

超大分页

在慢查询日志中发现了一些超大分页的慢查询如 Limit 40000,1000,因为 MySQL 的分页是在 Server 层做的,可以采用延迟关联在减少回表。

但是看了相关的业务代码正常的业务逻辑是不会出现这样的请求的,所以很有可能是有恶意用户在刷接口,最好在开发的时候也对接口加上校验拦截这些恶意请求。

 

业务代码循环读数据库

考虑这样一个场景,获取用户粉丝列表信息,加入分页是十个,其实像这样的 SQL 是十分简单的,通过连表查询性能也很高。

但是有时候,很多开发采用了取出一串 ID,然后循环读每个 ID 的信息,这样如果 ID 很多对数据库的压力是很大的,而且性能也很低。

 

统计 SQL

很多时候,业务上都会有排行榜这种,发现公司有很多地方直接采用数据库做计算,在对一些大表做聚合运算的时候,经常超过五秒,这些 SQL 一般很长而且很难优化。

像这种场景,如果业务允许(比如一致性要求不高或者是隔一段时间才统计的),可以专门在从库里面做统计。另外我建议还是采用 Redis 缓存来处理这种业务。

 

另外,Mysql优化可以说是面试必问,在此,汇总mysql优化的14条建议~

1. 避免使用 select *

2. 当你只需要查询出一条数据的时候,要使用 limit 1

3. 建数据库表时,给字段设置固定合适的大小

4. 建立高性能的索引

5. EXPLAIN 你的 SELECT 查询

6. 要尽量使用not null

7. 在Join表的时候,被用来Join的字段,应该是相同的类型的,且字段应该是被建过索引的。

8. 不建议使用%前缀模糊查询,这种查询会导致索引失效而进行全表扫描

9. 要慎用in和 not in

10. 垂直分割

11.避免在where子句中对字段进行表达式操作

12.应尽量避免在 where 子句中使用 !=或<> 操作符

13.应尽量避免在 where 子句中对字段进行 null 值 判断

14.应尽量避免在 where 子句中使用 or 来连接条

 

还总结了一些常被问到的mysql相关面试题,分享给大家~

1.你知道哪些MySQL存储引擎?

2.常见的存储引擎都适用于哪些场景?

3.InnoDB和MyISAM的区别有哪些?

4、InnoDB和MyISAM,select  count(*)哪个更快,为什么?

5、MyISAM Static和MyISAM Dynamic有什么区别?

6.char和varchar的区别是什么?

7.varchar(10)和int(10)分别有什么含义?

8.MySQL的binlog有几种录入格式,它们之间有什么区别?

9.如何在Unix和MySQL时间戳之间进行转换?

10.怎样才能找出最后一次插入时分配了哪个自动增量?

11.列设置为AUTO INCREMENT时,如果在表中达到最大值,会发生什么情况?

12.MySQL中,如果一个表有一列定义为TIMESTAMP,则会发生什么?

13.如果要存储用户的密码散列,应该使用什么字段进行存储?

14.什么是索引?

15.索引有什么优缺点?

16.索引的数据结构和什么有关?

17.MySQL主要的索引类型有哪些?

18.在建立索引的时候,需要考虑哪些因素?

19.Hash索引和B+树索引有什么区别?

20.非聚簇索引一定会回表查询吗?

21.什么是联合索引?为什么需要注意联合索引中的顺序?

22.怎样知道语句运行很慢的原因?

23.为何会发生针对该列创建了索引但是在查询的时候并没有使用的问题?

24.你对MySQL锁是怎么理解的?

25.加锁有什么好处?

26.Mysql中有哪几种锁?

27.什么是死锁?锁等待?通过数据库哪些表可以监控?

28.MySQL中InnoDB引擎的行锁是如何实现的?

29.你知道哪些优化锁的方法?

30.什么是事务?

31.ACID是什么?

32.事务是如何通过日志来实现的?

33.同时有多个事务在进行会怎么样?

34.MySQL的事务隔离级别有哪些?

35.InnoDB使用的是哪种隔离级别?

36.REPEATABLE READ隔离级别下 MVCC 如何工作?

37.InnoDB 如何开启手动提交事务?

38.在 InnoDB 中设置了 autocommit=0,添加一条信息之后没有手动执行提交操作,请问这条信息可以被查到吗?

39.为什么要尽量设定一个主键?

40.主键使用自增ID还是UUID?

41.字段为什么要求定义为not null?

42.explain出来的各种item的意义是什么?

43.profile的意义以及使用场景有哪些?

44.统计过慢查询吗?对慢查询都怎么优化过?

45.说一说你能想到的sql语句优化,至少五种

46.说一说你能想到的表结构优化,至少五种

47.数据三大范式是什么?

48.超大分页如何处理?

49.MySQL数据库cpu飙升到500%的话,该如何处理?

50.什么是存储过程?

 

获取答案或者更多mysql内容:V信扫描下面二维码,关注后回复“mysql”即可~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章