数据表js和查询次数php mysql

Posted

技术标签:

【中文标题】数据表js和查询次数php mysql【英文标题】:Datatables js and number of queries php mysql 【发布时间】:2019-10-02 00:15:53 【问题描述】:

提前计划“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 个数据库查询所需要的?谢谢。

【问题讨论】:

【参考方案1】:

我已广泛使用数据表(例如,浏览计费数据库中的 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 个结果,并向用户抱怨输入更好如果超出此限制,则搜索条件。数据表可以请求很多,但您的服务器不必接受它。

    索引可以提高性能,但代价是它们会占用更多空间。为您的用户常用的查询设置特定索引。

    考虑“去抖动”搜索输入,方法是添加一个 javascript 超时,该超时仅在用户在一段时间(例如 1 秒)后停止输入后才提交搜索请求。

    我已将 BLOB 和静态文本数据从数据库移出到磁盘文件或像 Mongo 这样的 NOSQL 替代方案,并确保两种实现的主键匹配。您会发现您将使用的任何数据库肯定会更快地使用,包括执行备份,我相信您会这样做。

您的里程可能会有所不同,但正如您所知,您可以做很多事情来提高性能 - 只是不要尝试每次都一次查询所有内容。没有人关心对庞大数据集的确切计数,如果他们这样做了,那么他们真正想要的是一份报告,这是一个不涉及数据表的不同用例。

【讨论】:

以上是关于数据表js和查询次数php mysql的主要内容,如果未能解决你的问题,请参考以下文章

php查询sql表中数据,存在则返回显示1,不存在显示0

新手求助如何在js上使用ajax接收php读取的mysql数据并输出

PHP+Mysql+jQuery实现文件下载次数统计

php 接口与前端数据交互实现

MYSQL一次千万级连表查询优化

php 接口与前端数据交互实现