数据表js和查询数php mysql

时间:2019-05-14 22:23:11

标签: php mysql sql datatables

先进行计划,然后折旧使用“ 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 个答案:

答案 0 :(得分:3)

我已经广泛使用了数据表(例如,在计费数据库中浏览1000万条记录),很正确,需要3个查询,而无需进行任何优化即可获得所需的结果。如果绝对需要查询超过1000万个结果,则需要查看DB分片,因为在记录了100万条记录之后,诸如DB I / O之类的东西开始发挥重要作用。

但是,使用一些技巧,您可以在多达100万条记录的大型数据集上获得可接受的UX,这些记录几乎可以立即做出响应。因此,策略是操纵数据库并草拟查询,这样您就不必每次都考虑整个记录集。如果有动画反馈(Datatables具有此反馈)并且用户获得的结果始终是期望的结果,则用户总是愿意等待几秒钟,尤其是如果每次搜索仅返回一致的数百万条记录中的几条记录时。少即是多,这就是我们的目标。

以下是我尝试过的一些效果很好的东西:

  1. 如果您有那么多数据,那么每次执行COUNT都会返回一个精确的数字-是否每个请求都必须精确?最终用户是否需要查看报告的确切记录2,000,001,还是仅接受“ +200万”?如果是这样,您可以缓存总数并以较低的频率更新它吗?您只需要该数字即可返回确切的总数,除非您分页到最后,否则数据表实际上不会使用它。您可以将数据表配置为不报告确切的总数-因此只需给它们一个估算值即可。不过,您始终将需要过滤后的数字用于分页-但现在您只需要2个查询,而不是每次3个。

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

  3. 仅对某些列单独使用专用输入搜索字段并专门应用它们,而不是使用一个通用输入字段来对每列使用搜索条件以符合以下要求:其中field_name喜欢“搜索输入*”。 Datatables支持每列过滤器,但是我也看到了一些服务器端实现,所有列都有一个搜索输入,它们也可以在大型数据集上使用。无论如何,并非总是需要搜索所有列。

  4. 您一次不会返回对最终用户有意义的数百个结果-使用LIMIT子句,一次最多只能返回1000个结果,并向用户抱怨输入效果更好如果超出此限制,请搜索条件。数据表可以请求很多,但是您的服务器不必遵循它。

  5. 索引可以提高性能,但是要权衡的是它们会使用更多的空间。为用户常用的查询设置特定的索引。

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

  7. 我已经将BLOB和静态文本数据从数据库中移出到磁盘文件或Mongo等NOSQL替代文件中,并确保这两种实现的主键都匹配。您会发现使用的任何数据库绝对可以更快地处理,包括执行我确定可以执行的备份。

您的行驶里程可能会有所不同,但是正如您所知,可以采取许多措施来提高性能-只是不要尝试一次查询绝对的所有内容。没有人会在乎庞大数据集的确切数量,如果他们这样做了,那么他们真正想要的是一份报告,这是一个不涉及数据表的不同用例。