sql语句查询性能优化

表对另一张表统计并返回统计(一对一COUNT)

主表 cms_anthology ,关联关系表 cms_anthology_in_blog

  • 第一种,查询里面套查询
SELECT a.*, (SELECT count(*) FROM cms_anthology_in_blog ib WHERE ib.AnthologyId=a.Id) as Total FROM cms_anthology  a
  • 第二种,使用左连接方式
SELECT a.*,count(ib.BlogId) as total FROM
  cms_anthology a LEFT JOIN cms_anthology_in_blog ib on a.Id =ib.AnthologyId  GROUP BY a.Id

从查询效率上来说,第二种查询下来大幅提升
在这里插入图片描述
在这里插入图片描述

mysql实现每个分类下取N条数据

核心思想使用分组将,查找分类下随机数据后将主键变成集合形式(GROUP_CONCAT)后使用 FIND_IN_SET 取需要的条数,这里的分类不多的情况下使用 where xx in ()

SELECT 
    a.*
FROM
    cms_blog AS a,
    (SELECT 
        GROUP_CONCAT(id order by rand()) AS ids
    FROM
        cms_blog
				WHERE  cms_blog.CategoryId in (SELECT DISTINCT cms_blog.CategoryId FROM cms_blog)
    GROUP BY cms_blog.CategoryId)
		AS b
WHERE
    FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 2

性能提升版(提升好像不是很多)

SELECT 
    a.*
FROM
    cms_blog AS a,
    (SELECT 
       substring_index(GROUP_CONCAT(id order by rand()),',',2) AS ids
    FROM
        cms_blog
				WHERE  cms_blog.CategoryId in (SELECT DISTINCT cms_blog.CategoryId FROM cms_blog)
    GROUP BY cms_blog.CategoryId)
		AS b
WHERE
    FIND_IN_SET(a.id, b.ids) BETWEEN 1 AND 2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值