我正在设计一个带有 mysql 数据库的小型电子商务网站。我想保持 URL 干净,没有任何硬编码的产品 ID。
所以给定一个路径 http://example.com/shop/ {产品名称}
我选择将 {product-name} 转换为 PHP 中的 crc32 校验和并将其存储在产品表中。
收到产品页面请求时,会将其转换为 crc32 校验和并查询匹配行。我只对产品页面和博客页面执行了此操作。
我的问题
到目前为止,它在本地主机上运行良好。一旦流量增加,这将是一个可扩展的解决方案吗?有什么方法可以测试吗?
索引校验和列是否有助于 Select 查询?
校验和 INT UNIQUE NOT NULL
我读到插入语句会影响性能。但假设插入是偶尔的(博客每周 2-3 次或新产品可能 3 个月一次),2-3 秒的时间是可以接受的。它会变得多糟糕?
- 将校验和值存储为二进制更好吗?考虑在每次请求之前将校验和转换为二进制的额外任务。
最佳答案
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-donut
和 https://example.com/shop/coffee
。出色的。良好的搜索引擎优化。
I opted to convert the {product-name} to a crc32 checksum in PHP and store it in the product table.
这种方法有几个问题。
- 在如此短的校验和中存在潜在的冲突。不止一种产品可以轻松映射到相同的校验和。在您离开很久之前,这可能不会发生。
- 除非您的产品表中有数百万行,否则它对性能没有必要。对索引
varchar()
列的查找几乎与对整数列的查找一样快。 - 编程很麻烦。
- 在您的编程完成很长时间后,这是一个维护问题。
- 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/