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)的主要内容,如果未能解决你的问题,请参考以下文章