- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正尝试在一些大型(在没有搜索过滤器的最坏情况下大约 1000 万)记录集上使用 ZF2 分页器。我的表是 InnoDB 格式的,据我所知,它并没有作为元数据的一部分保留一个明确的计数。
我意识到我可以扩展 Zend\Paginator\Adapter\DbSelect 类并实现我自己的 count() 方法,该方法使用我手动存储在另一个表中的计数数据,但我不确定如何存储所有的计数可能进行的搜索排列。
默认ZF2 DbSelect adapter使用此方法:
<?php
public function count()
{
if ($this->rowCount !== null) {
return $this->rowCount;
}
$select = clone $this->select;
$select->reset(Select::LIMIT);
$select->reset(Select::OFFSET);
$select->reset(Select::ORDER);
$countSelect = new Select;
$countSelect->columns(array('c' => new Expression('COUNT(1)')));
$countSelect->from(array('original_select' => $select));
$statement = $this->sql->prepareStatementForSqlObject($countSelect);
$result = $statement->execute();
$row = $result->current();
$this->rowCount = $row['c'];
return $this->rowCount;
}
?>
这是方法为我生成的一个非常简单的示例查询:
SELECT
COUNT(1) AS `c`
FROM
(
SELECT
`contacts`.`id` AS `id`,
`contacts`.`firstname` AS `firstname`,
`contacts`.`middlename` AS `middlename`,
`contacts`.`lastname` AS `lastname`,
`contacts`.`gender` AS `gender`
FROM
`contacts`
WHERE
`contacts`.`trash` = '0'
) AS `original_select`
我不确定 MyISAM 表的性能如何,但这对我来说失败了,因为它占用了它所在的 Amazon RDS(25GB,db.m1.small)实例上的所有可用空间运行。作为比较,仅运行内部(原始)查询,它在 100 秒内完成(当然不好)并返回 739 万条记录。
这是来自内部查询的 EXPLAIN(计数上的 EXPLAIN 也因 RDS 服务器上的磁盘空间而失效):
+----+-------------+----------+------+---------------+-------+---------+-------+---------+-------+| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |+----+-------------+----------+------+---------------+-------+---------+-------+---------+-------+| 1 | SIMPLE | contacts | ref | trash | trash | 1 | const | 3441317 | |+----+-------------+----------+------+---------------+-------+---------+-------+---------+-------+1 rows in set (0.04 sec)
是否可以做些什么来更好地调整它? ZF2 Paginator 处理计数的方式是否与 InnoDB 做事的方式不兼容?如果我们允许对数据库中的大多数字段进行搜索,其他人将如何处理所有可能查询的缓存计数?
提前致谢...
最佳答案
您不需要从原始查询中进行选择 - 这会占用您的内存/磁盘空间!
SELECT count( 1 ) AS `c`
FROM (
SELECT 1
FROM `contacts`
WHERE `trash` = 0
) AS `original_select`
除此之外:
假设 trash 只是一个 bool 值,将其设为 bool 值不可空列并搜索 int 或 bool 值是 true/false
ALTER TABLE `contacts` CHANGE `trash` `trash` TINYINT( 1 ) NOT NULL
一定要索引垃圾列
ALTER TABLE `contacts` ADD INDEX `TRASH` ( `trash` )
更进一步:
大型结果集的分页不一定需要精确计数:假设我们每页显示 100 个条目,我们不需要 100000 个单页 N 按钮。而是使用您的偏移量和限制来计算页面,并且只显示单个按钮,例如上一页/下 10 页并将其与一些“显示下一页/上一页”按钮组合。
当您需要“转到最后一页”的可能性时,为什么不使用类似 DESC 命令的方式来实现类似的效果。
真的会有人对您的 1000 万行进行分页吗?也许提供高级过滤器来帮助用户找到他需要的东西。
关于mysql - 在 InnoDB 表上使用 ZF2 分页器的 Count() 的糟糕性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17241700/
我想在这里说的是我在从之前离开的相同状态重新启动我的应用程序时遇到的问题。我在这方面做了很多研发,并且已经解决了 stackoverflow 中发布的问题。所以请不要说它是重复的。 我试过设置这些选项
当我在我的类中实现 __cmp__ 函数时,python 是否会在内部重载“==”,我们在 C++ 中是如何做到的? 只是好奇。我是 python 的新手。 :) 最佳答案 ==的含义当您定义 __c
我在 Raspberry Pi2 上安装了 Gitlab,几个月来它运行良好。但自从关闭了RPi的电源后,它就不再起作用了。网页返回502错误。 502 Whoops, GitLab is takin
有人知道用户登陆带有Webfonts的页面时为什么Google Chrome浏览器崩溃吗 它并不会一直发生,而是经常发生 我刚得到一个蓝屏页面,却不知道为什么:该页面不是来自重定向时就很好了。 这是我
当我登录时,Skype始终会给出此错误。 糟糕,Skype存在问题。尝试注销然后重新登录。 STARTUP_LOAD_ERROR MACBOOK 最佳答案 Macbook 用户 退出Skype 回家
我正在尝试从 flutter 开始,首先我在 cmd 上运行 flutter doctor 它有效。在我安装了 ANDROID SDK 之后,同样的命令 flutter doctor 给了我异常:
从 android studio 终端运行 flutter attach 不工作。显示错误flutter 意外退出。 终端输出: flutter attach Checking for adverti
当使用 TinyMCE 4 测试所有浏览器时,Chrome 非常慢。 (我尝试从 TinyMCE 中删除所有插件,但没有任何区别。) Chrome 需要大约 20-25 秒在 TinyMCE 中呈现一
我试图让下面的脚本工作,以便从远程服务器(服务器 1)读取特定目录中的 CSV 文件列表,并将数据移植到另一台服务器的 PostgreSQL 数据库中。 我已经创建了一个 rsa SSH key 并将
在嵌入式 linux 环境中(在 PowerPC 上定制的 2.4.25)几个小时后我得到以下内核 panic : Oops: kernel access of bad area, sig: 11 N
在将现有 Node.js (Hapi.js) + RethinkDB 从 OVH VPS(最小 vps)迁移到 AWS Lambda( Node )+ DynamoDB 的过程中,我最近遇到了一个非常
我是一名优秀的程序员,十分优秀!