持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第15天,点击查看活动详情
从事后端开发已经有一段时间了,对mysql也有一定的了解,今天我分享一下我平时开发中遇到的一些导致mysql查询慢的情况,让广大朋友们可以避坑。
1、最简单的就是一张表没有任何索引,所有查询都会全表扫描,如果数据量大就会查询的很慢。
2、查询使用in元素过多也会导致慢查询。最好in的元素不要超过500个,如果超过了就分批进行查询。
3、我们把表加上了索引但是我们写查询条件时如果编写不规范或使用方法不合理会有可能导致索引失效。例如:某个字段时字符串类型,但是我们在编写查询语句时传的时一个数字,会导致索引失效。如果查询条件用的or也有可能导致索引失效的,A字段有索引,B字段没有索引,如果查询语句时A=1 or B=2,这样就会导致索引失效的。使用了like通配符以%开头,索引就会失效。
4、使用limit进行深分页会导致慢查询的。执行limit n 10语句时会先扫描n+10行数据,然后再丢弃前n行数据,返回后10行数据。如果n很大那就会导致扫描的行数很多。扫描的越多回表的次数就越多。
5、单表数据量太过庞大,索引的加速效果就没有那么显著。一棵高度为 2 的 B + 树,能存放 1170 * 16=18720 条这样的数据记录。同理一棵高度为 3 的 B + 树,能存放 1170 *1170 *16 =21902400,也就是说,可以存放两千万左右的记录。B + 树高度一般为 1-3 层,已经满足千万级别的数据存储。如果 B + 树想存储更多的数据,那树结构层级就会更高,查询一条数据时,需要经历的磁盘 IO 变多,因此查询性能变慢。
以上是我个人锁了解的一些会导致慢查询的情况,如果大家有其他会导致数据库查询变慢的情况可以在评论区跟我分享一起学习。
谢谢观看!streetlamp敬上!