加入收藏 | 设为首页 | 会员中心 | 我要投稿 云计算网_泰州站长网 (http://www.0523zz.com/)- 视觉智能、AI应用、CDN、行业物联网、智能数字人!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php – 优化此SQL查询

发布时间:2021-03-30 22:08:45 所属栏目:MySql教程 来源:网络整理
导读:这个SQL查询让我感到厌恶.我没有写它,但它是我们服务器问题的一个重要原因.我愿意将它分成多个查询并通过PHP进行一些处理(比如,RAND()). $sql = "SELECT a.code,a.ad_id,a.position,a.type,a.image,a.url,a.height,a.width FROM " . AD_TABLE ." a," . USE

这个SQL查询让我感到厌恶.我没有写它,但它是我们服务器问题的一个重要原因.我愿意将它分成多个查询并通过PHP进行一些处理(比如,RAND()).

$sql = "SELECT a.code,a.ad_id,a.position,a.type,a.image,a.url,a.height,a.width
    FROM " . AD_TABLE ." a," . USER_GROUP_TABLE . " g
    WHERE (a.max_views >= a.views OR a.max_views = '0')
    AND (FIND_IN_SET(" .$forum_id. ",a.show_forums) > 0 OR a.show_all_forums = '1')
    AND g.user_id = " . $user->data['user_id'] . "
    AND FIND_IN_SET(g.group_id,a.groups)
    AND FIND_IN_SET(" . $user->data['user_rank'] . ",a.ranks)
    AND a.start_time < " . time() . "
    AND a.end_time > " . time() . "
    AND (a.clicks <= a.max_clicks OR a.max_clicks = '0')
    ORDER BY rand()";

是的,粘贴之后我觉得很蠢…

编辑:以下是上述格式的示例查询“EXPLAIN”的结果,逗号分隔:

"id","select_type","table","type","possible_keys","key","key_len","ref","rows","Extra"
1,"SIMPLE","g","user_id","3","const",6,"Using temporary; Using filesort"
1,"a","ALL","max_views","",10,"Using where"

它是 最佳答案 你有三个主要问题:

> FIND_IN_SET.

这不是一件容易的事,一个索引不能让它变得更快.创建多对多关系表(或多个表).

> a.start_time< GETDATE()和a.end_time> GETDATE()

MySQL不善于优化.您可以将时间跨度作为几何框保留,并为它们创建一个空间索引,这将更快(尽管可读性较差)

>兰德令()

如果您使用它来对数据进行采样(即,您不需要所有行,而是需要一个小的随机子集),那么有一种更有效的方法可以执行此操作,如本文在我的博客中所述:

> Selecting random rows

(编辑:云计算网_泰州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读