php - Mysql - 选择具有校验和值的行

标签 php mysql

我正在设计一个带有 mysql 数据库的小型电子商务网站。我想保持 URL 干净,没有任何硬编码的产品 ID。

所以给定一个路径 http://example.com/shop/ {产品名称}

我选择将 {product-name} 转换为 PHP 中的 crc32 校验和并将其存储在产品表中。

收到产品页面请求时,会将其转换为 crc32 校验和并查询匹配行。我只对产品页面和博客页面执行了此操作。

我的问题

  1. 到目前为止,它在本地主机上运行良好。一旦流量增加,这将是一个可扩展的解决方案吗?有什么方法可以测试吗?

  2. 索引校验和列是否有助于 Select 查询?

    校验和 INT UNIQUE NOT NULL

我读到插入语句会影响性能。但假设插入是偶尔的(博客每周 2-3 次或新产品可能 3 个月一次),2-3 秒的时间是可以接受的。它会变得多糟糕?

  1. 将校验和值存储为二进制更好吗?考虑在每次请求之前将校验和转换为二进制的额外任务。

最佳答案

I'm designing a small ecommerce website with a mysql database. I wanted to keep the URL clean without any hard coded product id.

So given a path http://example.com/shop/{product-name}

例如,您的意思是 https://example.com/shop/jelly-donuthttps://example.com/shop/coffee。出色的。良好的搜索引擎优化。

I opted to convert the {product-name} to a crc32 checksum in PHP and store it in the product table.

这种方法有几个问题。

  1. 在如此短的校验和中存在潜在的冲突。不止一种产品可以轻松映射到相同的校验和。在您离开很久之前,这可能不会发生。
  2. 除非您的产品表中有数百万行,否则它对性能没有必要。对索引 varchar() 列的查找几乎与对整数列的查找一样快。
  3. 编程很麻烦。
  4. 在您的编程完成很长时间后,这是一个维护问题。
  5. MySQL(和其他数据库系统)是为在各种数据上进行快速 SELECT 查找而构建的。数千年的程序员(真的!)已经投入到使这种事情变得更快。如果您认为您需要通过微不足道的优化来改进那些程序员,那么您就错了。当然在这种情况下。

Will this be a scalable solution once traffic increases?

是的,会的。但是查找您的产品名称也是如此。

Will indexing the checksum column help for Select queries?

是的,您应该为 SELECT 查询中使用的任何一组列建立索引。索引是一门艺术。检查一下 https://use-the-index-luke.com一旦正确索引了少于一百万行的表,SELECT 语句应该是快速且可扩展的。

如果您没有正确地为表建立索引,无论您查找的是什么数据类型,您的查询都会非常缓慢。

I read insert statement will take a performance hit.

微不足道的打击。每次插入最多几毫秒。

Is storing the checksum value as a binary better?

如果您使用二进制,您将在每个 SELECT 上节省数十微秒。几十微秒并不重要。

Consider the additional task of converting the checksum to binary before every request.

这里唯一重要的是您的编程和维护时间。

让您的系统保持简单。不要借麻烦,尤其是关于不同数据类型搜索之间差异的想象麻烦。

关于php - Mysql - 选择具有校验和值的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48096548/

相关文章:

当我上传 mp4 文件时,PHP FFMPEG 不工作

php - 无法创建表

mysql - 如何从一对多关系的 "many"表中选择具有两个特定子 ID 的父 ID?

PHP 警告 : Unknown: Error occured while closing statement in Unknown on line 0

php - 如何使用 PHP 检查一个单词是否包含在另一个字符串中?

php - 在 PHP 中使用 mod_rewrite 访问设置的环境变量

php - 使用 Gears 和 PHP 上传文件

c# - 解析,parseexact字符串(varchar)从db mysql到sql查询中的datetimepicker C#

java - 在 mysql 中存储多行单条记录的更好方法是什么

php - 如何将 PHP 变量传递给 Laravel DB::未准备好的查询