php - 数据表js和查询次数php mysql
问题描述
提前计划“sql_calc_found_rows”被折旧并使用新的数据表 1.10.18 我有一个问题。对于服务器端处理,您需要反馈总数和过滤总数。因此,从我收集到的信息来看,我必须为每个请求运行 3 个单独的查询,这似乎有点过分,但我想不出如何在不这样做的情况下获取信息。
// Grab the data with page offset
// for "data"
$query1 = 'SELECT .. FROM .. WHERE .. LIMIT ..'
// Grab filtered total which is the total using the "WHERE" without the "LIMIT"
// for "recordsFiltered"
$query2 = 'SELECT COUNT FROM .. WHERE .. '
// Grab the total records without the WHERE
// for "recordsTotal"
$query3 = 'SELECT COUNT FROM ..'
对于复杂的查询和半大型数据集(100k-2mill)记录,每次有人在搜索中键入一个字母(他们键入一个单词时的每个字母)或点击列排序和更改页面时间和数量时,都会触发这一事实的查询/执行似乎很疯狂。
我是否遗漏了任何东西,或者这只是使用数据表必须在每个请求中触发 3 个数据库查询所需要的?谢谢。
解决方案
我已经广泛使用了 Datatables(例如浏览计费数据库中的 1000 万条记录),你说得对,需要 3 次查询来获得你想要的结果,而无需任何优化。如果查询超过 1000 万条结果是绝对必要的,您将需要查看 DB 分片,因为在 100 万条记录之后,诸如 DB I/O 之类的东西开始发挥重要作用。
但是,使用一些技巧,您可以在多达 100 万条记录的大型数据集上实现可接受的用户体验,这些记录几乎可以立即响应。因此,策略是操纵数据库并草拟查询,这样您就无需每次都考虑整个记录集。如果有动画反馈(Datatables 有),用户总是愿意等待几秒钟,并且他们得到的结果总是他们所期望的,特别是如果它在每次搜索中始终返回数百万中的几条记录时. 少即是多,这是这里的目标。
以下是我尝试过的一些效果很好的方法:
如果您有这么多数据,那么每次执行 COUNT 都会返回一个准确的数字 - 每个请求都需要准确吗?最终用户是否需要准确查看报告的 2,000,001 条记录,或者只是“+200 万”可以接受?如果是这样,您可以缓存总数并减少更新频率吗?您只需要该数字即可返回确切的总数,除非您已经分页到最后,否则 Datatables 不会实际使用它。您可以将数据表配置为不报告确切的总数 - 所以只需给他们一个估计值。但是,您将始终需要过滤后的数字进行分页 - 但现在您每次只需要 2 个查询而不是 3 个。
如此庞大的数据集往往是只读的,并且只是随着时间的推移而附加,例如销售记录。您可以为其添加自定义数据库索引(例如,使用日期按年份过滤),并确保您的 WHERE 子句首先使用此检查,除了 Datatables 搜索请求实际上是什么?请注意,Datatables 允许您为每个 AJAX 请求客户端添加自定义参数,因此您可以使用外部选择器(例如,带有年份的组合框,默认为当前年份)来帮助在索引有用的查询表达式中更早地过滤结果。
仅对某些列单独使用专用输入搜索字段并专门应用它们,而不是使用一个通用输入字段,该输入字段在每一列上使用搜索条件:where field_name LIKE 'search input*'。Datatables 支持每列过滤器,但我也看到了一些服务器端实现,所有列都有一个搜索输入,这也可以处理大型数据集。在任何情况下,并非所有列都需要始终进行搜索。
您一次不会返回超过几百个对最终用户有意义的结果 - 使用 LIMIT 子句,一次最多返回 1000 个结果,如果此限制为,则向用户抱怨输入更好的搜索条件超过。数据表可以请求很多,但您的服务器不必接受它。
索引可以提高性能,但代价是它们使用了更多空间。为用户常用的查询设置特定索引。
考虑“去抖动”搜索输入,通过添加仅在用户停止输入一段时间(例如 1 秒)后才提交搜索请求的 javascript 超时。
我已经将 BLOB 和静态文本数据从数据库移到磁盘文件或像 Mongo 这样的 NOSQL 替代方案,并确保两种实现的主键匹配。您会发现您将使用的任何数据库肯定会更快地使用,包括执行备份,我相信您会这样做。
您的里程可能会有所不同,但正如您所知道的,您可以做很多事情来提高性能 - 只是不要每次都尝试绝对查询所有内容。没有人关心对庞大数据集的确切计数,如果他们这样做了,那么他们真正想要的是一份报告,这是一个不涉及数据表的不同用例。
推荐阅读
- python - 用于验证日期和性别代码的 Python 代码
- laravel - 问题在服务器上加载 websocket 服务和 laravel 和 vue.js
- angular - 如何在 Angular 应用程序中使用 @graphy npm 包?
- ios - Swift:如何以编程方式在 TableViewCell 中显示 CollectionView
- python - 如何在 django 中的子查询集上使用 order 子句过滤查询集
- flutter - 在等待初始化应用程序时显示进度指示器,例如在验证用户时
- python - 如何使用熊猫更改 csv 表?
- vue.js - 由于多人应用程序,Vus JS 更新文本区域一次
- python - 使用烧瓶在 HTML 文件中显示部分 python 字典
- ios - 嵌入在 UIStackView 中的 UITableView 不会重新加载数据