接下来我分失效场景和不失效场景分开来讲解
失效场景
- 在MySQL中,如果使用`LIKE`语句以 `%` 开头进行模糊查询,则可能会使索引失效而导致性能问题,这是因为通常情况下,MySQL会在索引的 b-tree 中进行匹配,而在模糊查询时,比如说我有下面这条SQL:select * from `user` where name like '%牛'; 由于B+树是按顺序查找的,前面无法确定的话后面是无法使用索引,所以前面有%会导致索引失效,改为全表扫描,这会导致索引失效并且查询速度变慢。
不失效场景
- 比如说我有下面这条SQL:select id,name from `user` where name like '%牛'; 首先id,name 这两个字段都在我们的二级索引中,叶子节点存的索引值和主键值,所以我们只要二级索引就可以直接拿到我们的需要的字段,这个叫做索引覆盖。我们观察执行计划会发现它的查询级别是 index ,其实也是全表遍历了二级索引。
那为什么就要走二级索引而不是走全表扫描呢?
- 因为二级索引中记录的东西比主键索引少了很多,只有索引值和主键值,一页中可以存储更多数据,再加上索引覆盖不用回表,优化器就认为直接遍历辅助索引的效率高于主键索引。
总的来说,在设计数据库时,应该尽量避免使用以 `%` 开头的模糊查询,特别是针对大量数据的查询。可以通过调整查询语句或者添加全文索引等方法来优化查询性能。