0

我有一个大约 9.5K 行的 MySQL 表,这些不会有太大变化,但我可能会慢慢添加。

我有一个过程,如果有人扫描条形码,我必须检查该条形码是否与此表中的值匹配。实现这一目标的最快方法是什么?我必须提到这些价值观没有模式

这里有一些想法

  1. Ajax 调用 PHP 文件来查询 MySQL 表(我的想法会是最慢的)
  2. 登录时将此 MySQL 表加载到数组中。然后在扫描 Ajax 调用 PHP 文件时检查数组
  3. 登录时将此表加载到数组中。查看扫描页面时,以某种方式将该数组加载到 JavaScript 数组中并使用 JavaScript 检查。(在我看来这似乎是最快的,因为它消除了 Ajax 调用和 MySQL 查询。拆分成更小的数组是否有效,这样我就不会落后于服务器和浏览器?)
4

4 回答 4

6

老实说,我永远不会为任何东西加载整个表。我要做的就是向 PHP 网关发出 AJAX 请求,然后查询数据库并返回结果(或不返回任何内容)。它可以非常快(因为它仅取决于延迟)并且您可以大量缓存该结果(通过memcached或类似的东西)。

真的没有理由为“验证”加载整个数组......

于 2012-12-20T17:13:24.543 回答
2

使用索引良好的 MySQL 表要快得多,然后通过数组查找某些东西。

但最终,这一切都取决于您真正想要对数据做什么。

于 2012-12-20T17:01:48.627 回答
2

正如您提到的,您的表包含大约 9.5K 的数据。在登录或扫描页面上加载数据没有逻辑。

最好为您的表编制索引并在需要时进行 ajax 调用。

祝你好运!!

于 2012-12-20T17:05:09.863 回答
0

虽然 9.5 K 行并不多,但相关的数据量需要一些时间来传输。

因此——一般来说——我建议在服务器端运行值验证。AJAX 是很容易做到这一点的正确技术。

加载所有 9.5 K 行只是为了找到一个特定的行,这绝对是一种资源浪费。对单个值运行SELECT 查询

在客户端/AJAX 公开 PHP 功能

看看xajax 项目,它允许在客户端将整个 PHP 类或单个方法公开为 AJAX 方法。此外,xajax 有助于客户端和服务器之间的参数交换。

索引要搜索的属性

请确保保存条形码值的列已编入索引。如果验证过程趋于缓慢,请注意MySQL 表扫描

避免表扫描

To avoid table scans and keep your queries run fast, do use fixed sized fields. E.g. VARCHAR() besides other types makes queries slower, since rows no longer have a fixed size. No fixed-sized tables effectively prevent the database to easily predict the location of the next row of the result set. Therefore, you e.g. CHAR(20) instead of VARCHAR().

Finally: Security!

Don't forget, that any data transferred to the client side may expose sensitive data. While your 9.5 K rows may not get rendered by client's browser, the rows do exist in the generated HTML-page. Using Show source any user would be able to figure out all valid numbers.

Exposing valid barcode values may or may not be a security problem in your project context.

PS: While not related to your question, I'd propose to use PHPexcel for reading or writing spreadsheet data. Beside other solutions, e.g. a PEAR-based framework, PHPExcel depends on nothing.

于 2012-12-20T17:23:43.220 回答