MySQL时间查询不走索引_查询在什么时候不走索引

查询在什么时候不走索引

参考回答

主要三种情况

1 >

不满足走索引的条件, 常见的情况有

1.

1 >

不满足最左匹配原则

1.

2 >

查询条件使用了函数

1.

3>

or 操作有一个字段没有索引

1.

4 >

使用 like 条件以 % 开头

2 >

走索引效率低于全表扫描, 常见的情况有

2.

1 >

查询条件对 null 做判断, 而 null 的值很多

2.

2 >

一个字段区分度很小, 比如性别, 状态

3 >

需要回表的查询结果集过大, 超过了配置的范围

实际运用

使用索引是为了对查询做优化, 要衡量优化效果需要数据说话.

所以需要一些工具来衡量, 常用的有:

1 >

慢查询日志

开启慢查询日志, 可以针对慢 SQL 进行分析看看哪些可以用索引进行优化

2>

show processlist

show processlist 语句可以查看当前正在执行的 SQL, 如果一些 SQL 执行慢, block 了其他的 SQL, 这是个很好的工具

ec2705652f90137476827866a23a2e6d.png

82acf18ed88eba89b10916dc894bd366.png

3>

show profile 分析 SQL

使用这个工具可以分析出时间究竟耗费在哪个阶段.

先查询是否支持

2cc18812d60ced287f2171d670f8bd47.png

支持的话, 可以用 select @@profiling 查看是否开启, 如果结果为 0 说明未开启.

需要先 set @@profiling=1;

这时候就可以用 show profiles 查看每一条 SQL 语句耗费的时间

831520082e618c6383ecb880cfdfdf50.png

show profile for query XXID 可以查看具体耗费在哪个阶段

4>

Trace 分析优化器的执行计划

使用 set optimizer_trace='enabled=on',end_markers_in_json=on;

可以打开 trace 分析, 想查看具体的优化器执行计划, 只要执行

select * from `information_schema`.

optimizer_trace 即可

8501ef4fc37f7c1c5fbc14cccab38c82.png

点击开每一步都有很详细的分析

总结

知识只要学透了都可以灵活运用.

在运用的时候要注意衡量效果.

一个常见的误区是开发人员无脑的在 MySQL 上层加缓存, 用来提高效率.

但是缓存只适用于读多写少的情况, 比如在金融交易系统, 数据读写比例 1:1.

数据总是查询出来下一刻就被更新了, 这时候用缓存反而加重系统的负担和复杂性.

这时候, 我们可以先利用工具查询数据库的读写比例.

比如 show global status like 'Com_______' 这个 SQL 可以查看 select,update,insert,delete 都被执行了多少次.

8626a601223c324e1626bac2eb0790b6.png

或者 show global status like 'Innodb_row_%' 除了查看 Innodb 的读写情况, 还可以查看锁的情况.

784054a8d95f46eaca9ef2fb5e8f6c27.png

思考

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL的嵌套子查询和相关子查询在执行过程中可能会导致不索引的情况。下面分别介绍这两种子查询的执行过程。 1. 嵌套子查询的执行过程 嵌套子查询是指在一个查询语句中嵌套了另一个查询语句。例如: ``` SELECT * FROM table1 WHERE column1 IN (SELECT column2 FROM table2 WHERE column3 = 'value'); ``` 在执行这条语句时,MySQL会先执行内部的子查询,得到一个结果集,然后再将这个结果集作为外部查询的条件,去匹配表1中的数据。由于内部查询的结果集不是一个常量值,而是一个列表,因此MySQL无法使用索引来优化外部查询的执行。 如果内部查询返回的结果集很大,那么外部查询的性能就会受到影响。为了避免这种情况,可以使用关联查询来代替嵌套子查询: ``` SELECT * FROM table1 t1 JOIN table2 t2 ON t1.column1=t2.column2 WHERE t2.column3='value'; ``` 这样就可以避免嵌套子查询导致的性能问题。 2. 相关子查询的执行过程 相关子查询是指在一个查询语句中嵌套了一个与外部查询相关的子查询。例如: ``` SELECT * FROM table1 WHERE column1 > (SELECT AVG(column2) FROM table2 WHERE column3 = 'value'); ``` 在执行这条语句时,MySQL会先执行内部的子查询,得到一个常量值,然后再将这个常量值作为外部查询的条件,去匹配表1中的数据。由于内部查询返回的是一个常量值,而不是一个列表,因此MySQL可以使用索引来优化外部查询的执行。 然而,如果内部查询中使用了与外部查询相关的字段,那么MySQL就无法使用索引来优化内部查询的执行。例如: ``` SELECT * FROM table1 WHERE column1 > (SELECT AVG(column2) FROM table2 WHERE column3 = table1.column4); ``` 在这个查询中,内部查询中的WHERE条件使用了外部查询字段,因此MySQL无法使用索引来优化内部查询的执行。为了避免这种情况,可以使用JOIN来代替相关子查询: ``` SELECT t1.* FROM table1 t1 JOIN table2 t2 ON t1.column4=t2.column3 WHERE t1.column1 > AVG(t2.column2); ``` 这样就可以避免相关子查询导致的性能问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值