MySQL数据库查询索引失效场景

在连表情况下,如果排序字段涉及到了两个表,排序字段将无法走索引.

在这里插入图片描述
加上第二个排序字段之后,走全表扫描了.
在这里插入图片描述
或者尽量让两次排序都用同一个表的字段,这样可以建联合索引让排序也能走索引.(不想建联合索引的话,可以第二次排序用表id,这样单个的索引也能实现二次排序)

使用了GROUP BY 导致排序字段索引失效

在这里插入图片描述
加了分组之后,order_no和school_customer_id都是有建索引的
在这里插入图片描述
在这里插入图片描述

连表字段编码方式不一致导致索引失效

如下图,如果o.id和op.order_id的编码方式不一样的话,索引会失效,并且这个索引失效通过查看执行计划看不出来.
在这里插入图片描述

LIKE查询左侧使用通配符

LIKE查询的时候如果左侧使用%或者_,索引会失效.

在这里插入图片描述
在这里插入图片描述

但如果左侧是具体的值,则还可以走索引.
在这里插入图片描述

使用!=或<>

在这里插入图片描述
在这里插入图片描述

联合索引不符合最左前缀

比如新建一个联合索引idCard_email,
在这里插入图片描述

如果直接查email是不会走该索引的.
在这里插入图片描述

但如果查询联合索引左侧的idCard则会走索引
在这里插入图片描述
或者两个字段都查的时候也走索引,两个字段都查的时候,SQL执行器会优化查询顺序的.
在这里插入图片描述

条件字段类型不一致

数据库字段是varchar,传入数字类型的话索引会失效
在这里插入图片描述
在这里插入图片描述

条件匹配对数据库字段使用了函数

在这里插入图片描述
在这里插入图片描述

范围查询的时候数据量超过达到全表的10%~30%,优化器会转用全表扫描

在这里插入图片描述

在这里插入图片描述

非SQL层面的优化

可以考虑增大buffer pool的大小,单位是Byte

mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.01 sec)
mysql> set global innodb_buffer_pool_size = 536870912;
Query OK, 0 rows affected (0.01 sec)

mysql> show global variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name           | Value     |
+-------------------------+-----------+
| innodb_buffer_pool_size | 536870912 |
+-------------------------+-----------+
1 row in set (0.01 sec)

如果数据库连接数不够用,还可以考虑增加数据库最大连接数

查看当前数据库连接使用情况

show status like  'Threads%';

在这里插入图片描述
Threads_connected :这个数值指的是打开的连接数.
Threads_running :这个数值指的是激活的连接数,这个数值一般远低于connected数值.

查看最大数据库连接数

show variables like '%max_connection%';
set global max_connections=1000;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值