Mysql,需要一些关于我的查询的连接和索引的建议,还有一个 round(count(field) / 20 +1)

Posted

技术标签:

【中文标题】Mysql,需要一些关于我的查询的连接和索引的建议,还有一个 round(count(field) / 20 +1)【英文标题】:Mysql, need some advice about the join and indexes on my query, also have a round(count(field) / 20 +1) 【发布时间】:2011-01-20 09:21:28 【问题描述】:

我正在尝试改进我的查询,我正在计算特定类别中的所有记录,我还在计算每个类别需要多少页来显示所有该类别中的记录。

我希望提高查询速度。我不能 100% 确定连接和索引是否最有效。

我已经在 5 点尝试了 LIMIT,但没有任何区别。

这是我的问题

SELECT PageBase, round((count(pads.padid) / 20) + 1) as totpages FROM 
categories, pads WHERE pads.catid = categories.catid AND 
`RemoveMeDate` = '2001-01-01 00:00:00' group by categories.catid LIMIT 50,50

这里是解释

这是分类表的结构

CREATE TABLE categories (
  CatID int(11) NOT NULL DEFAULT '0',
  NewASP text NOT NULL,
  `Specific` text NOT NULL,
  PageBase varchar(50) NOT NULL,
 PRIMARY KEY (CatID),
 KEY PageBase (PageBase)
 ) ENGINE=MyISAM DEFAULT CHARSET=latin1;

这是正在运行的查询

【问题讨论】:

通常分页不在数据库中完成,而是获取匹配数,在应用程序级别使用任何类型的编程语言进行 显示 EXPLAIN 输出。只需在查询之前添加 EXPLAIN 并再次运行它。 COUNT 表达式看起来错误。它为 20 条记录返回 2 页。使用 FLOOR((count(pads.padid)+19) / 20) @ajreal,删除 round((count(pads.padid) / 20) + 1) 并离开 padid 不会使查询更快。 @cyberkwiki,见上面Heres the explain的地方。 【参考方案1】:

这些方法有更好的效果吗?请显示 EXPLAIN 输出。

这会将它变成一个子查询,希望在限制子句之后运行。编辑:似乎没有。

SELECT PageBase, 
  floor((ifnull((select count(*) from pads
   where pads.catid = categories.catid
     AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages
FROM categories
LIMIT 50,50

这会强制它完成 50,50,希望这完全不需要时间,然后执行 50 个计数子查询。

SELECT PageBase,
   floor((ifnull((
        select count(1) from pads
        where pads.catid = C.catid
          AND RemoveMeDate = '2001-01-01'),0)+19)/20) as totpages
FROM (
    SELECT PageBase, CatID
    FROM categories
    LIMIT 50,50) C

仅供参考,count(1) 和 count(*) 是相同的。 count(pads.catid) 可能会慢一点,因为它需要在计数之前确定 pads.catid 是否为空(在此查询中,我们知道它不能为空)。

【讨论】:

哇是的(我也加了 1)。但是我对那颗星感到困惑/担心,我可以制作那个 pads.padid 吗? 我仍然对 +1 感到困惑?为什么? 是的,你是对的,不需要加 1,谢谢 :) 更快:)

以上是关于Mysql,需要一些关于我的查询的连接和索引的建议,还有一个 round(count(field) / 20 +1)的主要内容,如果未能解决你的问题,请参考以下文章

「mysql优化专题」单表查询优化的一些小总结,非索引设计

MySQL性能优化之索引设计

补12.关于mysql的索引回顾

性能分析之 MySQL Report 分析(建议收藏)

关于oracle索引数量

mysql查询慢--2小时+