mysql select column_select * 比select column快很多奇怪案例分析

遇到MYSQL傻傻的地方,下面给个案例,大家感受下:

注意以下两个sql只有select *和select g.id区别。

SQL1:

SELECT

g.id

FROM

table1 g

INNER JOIN table2 l ON concat('订单号:',CONVERT(g.id,char)) = l.info

WHERE LOCATE('付款操作',l.info) AND g.p = 2

LIMIT 100

查询时间:5.28s

SQL2:

SELECT

*

FROM

table1 g

INNER JOIN table2 l ON concat('订单设为付款操作成功 订单号:',CONVERT(g.id,char)) = l.info

WHERE LOCATE('付款操作成功',l.info) AND g.p = 2

LIMIT 100

查询时间:0.21s

注意以下Sending data的sql1比sql2慢,这是不是很诡异!!!!!!!!!!!!!!

SQL1:

547e17fa47829148b86fd6aca336dcfc.png

SQL2:

738b71d97a0ca418a078c7347af0c532.png

分析下profile的情况:

sql1的Context_voluntary | Context_involuntary | Block_ops_in | Block_ops_out 比sql2的高很多,按理说字段少,处理数据更快啊!这里为什么反而更慢?????

Context_voluntary :这个是主动上下文切换次数

Context_involuntary :这个是被动上下文切换次数

Block_ops_in :这个是阻塞输入操作

Block_ops_out :这个是阻塞输出操作

下面说下原因为什么select column比select *慢:

1.select column比select *处理的数据少

2.mysql的select操作使用的是悲观锁

3.cpu对select column的处理速度要快于select *

4.导致cpu处理完一批数据,ops_in 跟不上,而使用悲观锁,cpu不会自旋,等待数据,而是切换到其它任务

5.所以数据量少的上下文切换的更频繁

6.所以select * 比select column快了很多

解决办法:

多加几个字段,增加数据量,这样cpu就没有等待,进行的上下文切换就会少很多,速度就会快很多。如果应用嫌获得数据太多,应用层获得数据把这些数据进行过滤掉就行了。最好的办法是拆分字段,使查询走索引。

SELECT

g.id,g.column1,g.cloumn2

FROM

table1 g

INNER JOIN table2 l ON concat('订单号:',CONVERT(g.id,char)) = l.info

WHERE LOCATE('付款操作',l.info) AND g.p = 2

LIMIT 100

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL数据库中,SELECT是用于从一个或多个表中检索数据的关键字。SELECT查询表达式的基本语法如下: ```sql SELECT column1, column2, ... FROM table_name WHERE condition; ``` 其中,column1、column2等为要检索的列名,可以使用通配符*代替所有列。table_name为要检索的表名,condition为可选的筛选条件。 在SELECT查询表达式中,可以使用多种表达式来生成结果集。以下是一些常用的SELECT表达式: 1. 聚合函数:用于对结果集进行统计计算,例如SUM、COUNT、AVG、MAX、MIN等。 ```sql SELECT SUM(column_name) FROM table_name; ``` 2. 别名:用于为查询结果中的列或表指定别名,以便更好的阅读和理解查询结果。 ```sql SELECT column_name AS alias_name FROM table_name; ``` 3. 子查询:嵌套在SELECT语句中的查询语句,用于从子查询中获取数据,然后在主查询中使用它。 ```sql SELECT column_name FROM table_name WHERE column_name IN (SELECT column_name FROM table_name WHERE condition); ``` 4. 连接:用于将两个或多个表中的数据合并到一个结果集中,包括INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL OUTER JOIN等。 ```sql SELECT column_name FROM table1 INNER JOIN table2 ON table1.column_name = table2.column_name; ``` 5. 字符串函数:用于处理字符串数据,例如CONCAT、LENGTH、SUBSTRING、UPPER、LOWER等。 ```sql SELECT CONCAT(first_name, ' ', last_name) AS full_name FROM table_name; ``` 6. 条件表达式:用于根据条件过滤结果集,例如IF、CASE等。 ```sql SELECT column_name, IF(column_name > 10, '大于10', '小于等于10') AS result FROM table_name; ``` 以上是MySQL数据库中常用的SELECT查询表达式,可以根据实际需求选择使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值