Datatables js和查询数php mysql

Datatables js和查询数php mysql,php,mysql,sql,datatables,Php,Mysql,Sql,Datatables,提前计划“sql\u calc\u found\u rows”被折旧,并使用新的datatables 1.10.18,我有一个问题。对于服务器端处理,您需要反馈总计和过滤后的总计。因此,从我收集的信息来看,我必须对每个请求运行3个单独的查询,这似乎有些过分,但我想不出不这样做如何获取信息 // Grab the data with page offset // for "data" $query1 = 'SELECT .. FROM .. WHERE .. LIMIT ..' // Grab

提前计划“sql\u calc\u found\u rows”被折旧,并使用新的datatables 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)记录,以及每次有人在搜索中键入一个字母(每个字母都是他们在一个单词中键入的)或点击列排序和更改页面时都会触发此事件,查询/执行的时间和数量似乎非常疯狂


我是否遗漏了什么,或者这仅仅是使用datatables必须在每个请求中发出3个数据库查询所必需的吗?谢谢。

我已经广泛使用了数据表(例如,在一个计费数据库中浏览1000万条记录),您是对的,需要3次查询才能实现您想要的结果,而无需任何优化。如果查询超过1000万个结果是绝对必要的,那么您将需要查看DB分片,因为在100万个记录之后,DB I/O之类的东西开始发挥重要作用

然而,使用一些技巧,您可以在多达一百万条记录的大数据集上实现可接受的用户体验,这些记录几乎可以立即响应。因此,策略是操作DB和草稿查询,这样您就不必每次都要考虑整个记录集。如果有动态反馈(Datatables有),用户总是愿意等待几秒钟,并且他们得到的结果总是他们期望的结果,特别是如果每次搜索时它只返回数百万条记录中的几条记录。少就是多,这是我们的目标

以下是我尝试过的一些行之有效的方法:

  • 如果你有那么多数据,每次进行计数都会返回一个精确的数字——是否每个请求都需要精确的数字?最终用户是否需要查看报告的2000001条记录,或者是否可以接受“+200万条”?如果是这样,您是否可以缓存总数并以较低的频率更新它?您只需要这个数字就可以返回准确的总数,而Datatables实际上不会使用它,除非您已经分页到最后。您可以将Datatables配置为不报告确切的总数,因此只需给它们一个估计值即可。不过,分页总是需要经过筛选的数字,但现在每次只需要2个查询,而不是3个查询

  • 像销售记录一样,这样庞大的数据集往往是只读的,并且随着时间的推移只是附加到数据集中。除了Datatables搜索请求的实际内容外,是否可以为其添加自定义DB索引(例如,使用日期按年份筛选),并确保WHERE子句首先使用此检查?请注意,Datatables允许您在每个AJAX请求客户端添加自定义参数,因此您可以使用外部选择器(例如带有年份的组合框,默认为当前年份)来帮助过滤查询表达式中索引有用的早期结果

  • 仅对某些列单独使用专用输入搜索字段,并将其具体应用,而不是使用一个通用输入字段,该字段在每一列上使用搜索条件,以调整:where field_name,如“search input*”。Datatables支持每列过滤器,但我也看到一些服务器端实现,所有列都有一个搜索输入,这也适用于大型数据集。在任何情况下,都不需要始终搜索所有列

  • 对于最终用户来说,一次返回的结果永远不会超过几百个——使用LIMIT子句,一次最多返回1000个结果,如果超过此限制,请向用户抱怨输入更好的搜索条件。Datatables可以请求很多,但您的服务器不必满足它

  • 索引可以提高性能,但折衷是它们使用了更多的空间。为用户常用的查询设置特定索引

  • 考虑通过添加javascript超时来“取消”搜索输入,该超时仅在用户在一段时间(例如1秒)后停止键入后提交搜索请求

  • 我已经将BLOB和静态文本数据从数据库移到磁盘文件或NOSQL替代文件(如Mongo),并确保两种实现的主键匹配。你会发现你使用的任何数据库都会更快,包括执行备份,我相信你会这么做

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