首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Typecho 获取随机文章性能最优版

Typecho 获取随机文章性能最优版

作者头像
用户7146828
发布2021-08-09 15:02:22
5990
发布2021-08-09 15:02:22
举报
文章被收录于专栏:旧云博客旧云博客

一般的来说,开发者获取随机文章最简单的方式就是使用 order by RAND(),然而这种方式在数据量稍大的时候可能产生数百毫秒的延迟。关于 mysql RAND() 的性能分析,网上已经很有多的文章了,本文不再赘述。大概意思就是,在ORDER BY从句里面不建议使用RAND()函数,因为这样会导致数据列被多次扫描。

以下直接给出优化后的获取随机文章的代码,能够极大的减少数据库查询时间。

typecho 版本:

$db = Typecho_Db::get();
$prefix = $db->getPrefix();

$adapterName = $db->getAdapterName();//兼容非MySQL数据库
if ($adapterName == 'pgsql' || $adapterName == 'Pdo_Pgsql' || $adapterName == 'Pdo_SQLite' || $adapterName == 'SQLite') {
    $order_by = 'RANDOM()';
    $user_former = false;
} else {
    $order_by = 'RAND()';
    $user_former = true;

}
// 使用原生sql
if($user_former){
    $sql = "SELECT * FROM `{$prefix}contents` WHERE cid >= (SELECT floor( RAND() * ((SELECT MAX(cid) FROM `{$prefix}contents`)-(SELECT MIN(cid) FROM `{$prefix}contents`)) + (SELECT MIN(cid) FROM `{$prefix}contents`))) and type='post'
            and status='publish' and (password is NULL or password='') ORDER BY cid LIMIT {$random};";
    $result = $db->query($sql);
}else{
    $sql = $db->select()->from('table.contents')
        ->where('status = ?', 'publish')
        ->where('table.contents.created <= ?', time())
        ->where('type = ?', 'post')
        ->limit($random)
        ->order($order_by);
    $result = $db->fetchAll($sql);
}

实现原理

假设数据库的主键为 cid。 比如最小的文章cid是1,最大的文章cid是10,那就从1到10之间选一个随机数,比如5,然后假设我们要取一篇文章,那么就是从 1 + 5 到 10 之间取。一定程度上降低了数据量。

但是怎么看都是薛定谔的处理方法,但总归比原来性能好了。 ::(超赞)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021年05月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 实现原理
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档