按照第一条的 SQL 查询 4 条数据,ID 分别为 3、2、4、1 然后按照第 2、3 条 SQL
进行同样的排序条件以及分页查询,预期的结果应该是 3、2 和 4、1 但是执行结果如下: ID 为 2
的数据竟然不见了,目前暂时通过 date desc, id desc
两个组合排序解决了此问题,但是又带来了新的问题,这样排序会导致索引实效。
【mysql】 【SQL】 【排序】 【Image】 【解决方案】 …
导读
今天给大家分享一个通过SQL改写而独辟蹊径的SQL优化案例
待优化场景
发现SLOW QUERY LOG中有下面这样一条记录:
...
# Query_time: 59.503827 Lock_time: 0.000198 Rows_sent: 641227 Rows_examined: 13442472 Rows_affected: 0
...
select uid,sum(power) powerup from t1 where
date>='2017-03-31' and
UNIX_TIMESTAMP(STR_TO_DATE(concat(date,' ',hour),'%Y-%m-%d %H'))>=1490965200 and
UNIX_TIMESTAMP(STR_TO_DATE(concat(date,' ',hour),'%Y-%m-%d %H'))<1492174801 and
aType in (1,6,9) group by uid;
实话说,看到这个SQL我也忍不住想骂人啊,究竟是哪个脑残的XX狗设计的?
竟然把日期时间中的 date 和 hour 给独立出来成两列,查询时再合并成一个新的条件,简直无力吐槽。
吐槽归吐槽,该干活还得干活,谁让咱是DBA呢,SQL优化是咱的拿手好戏不是嘛~
SQL优化之路 …
[获取更多]起因
前几天有位同事问我MySQL要怎么返回一张表的几行随机数据。这个问题其实网上随便一搜答案一大把,但是效果都不太理想,当你要获取随机几行(不是1行)时,得到的数据不是全随机的,而是随机区域。那么有没有办法真正的返回全随机的数据呢?
分析
一般来说获取随机数据,我们第一时间想到的应该是rand()函数。最直接的是order by rand() limit n,这完全能够符合我们的需求,但是效率之地令人发指。我们来看看手册里面是怎么对这个函数描述的:
Returns a random floating-point value v in the range 0 <= v
< 1.0.
…
You cannot use a column with RAND() values in an ORDER BY clause,
because ORDER BY would evaluate the column multiple times.
…
RAND() is not meant to be a perfect random generator. It is a
fast way to generate random numbers …
起因
前几天有位同事问我MySQL要怎么返回一张表的几行随机数据。这个问题其实网上随便一搜答案一大把,但是效果都不太理想,当你要获取随机几行(不是1行)时,得到的数据不是全随机的,而是随机区域。那么有没有办法真正的返回全随机的数据呢?
分析
一般来说获取随机数据,我们第一时间想到的应该是rand()函数。最直接的是order by rand() limit n,这完全能够符合我们的需求,但是效率之地令人发指。我们来看看手册里面是怎么对这个函数描述的:
Returns a random floating-point value v in the range 0 <= v
< 1.0.
…
You cannot use a column with RAND() values in an ORDER BY clause,
because ORDER BY would evaluate the column multiple times.
…
RAND() is not meant to be a perfect random generator. It is a
fast way to generate random numbers …
记得在很久以前我在公司内部做过一次MySQL优化分享里面说到一个使用延迟关联实现排序分页类型SQL的优化,这个案例在《高性能MySQL》的第二版还是第三版也有提及。
延迟关联:通过覆盖索引返回所需数据行的主键,再通过主键获取所需数据。
这里我们来看一个使用延迟关联优化排序分页SQL的案例:
123456789101112131415 |
mysql> select sql_no_cache * from t_user_log where appname = '发号中心' order by logintime limit 1000000,1;+---------+-----------+--------------------------+--------------+-----------------+------------------------------------+------------+-----------+-----------+| id | uid | username | appname | loginip | loginlocation | logintime | logintype | useragent … |