如何使用超过 250,000 行正确构建 "products" table?

How do I structure my "products" table correctly with over 250,000 rows?

问题

我找到了一份小工作,为一家电子分销商开发在线报价系统。他有大约 50 万个零件 - 一个小螺丝被认为是零件,一个小 LED 等。所以零件很多。

一个重要提示:这只是一个 RFQ(询价)。没有客户端价格、总计价格或任何与金钱有关的价格。只是收集零件号列表发送给我的客户。

我不得不从多个来源(供应商网站、扫描的纸质目录、Excel 电子表格、CSV 文件,甚至一些 JSON 文件收集零件数据。这很累人,但我搞定了。

结果

一开始很困惑。我有几十个产品类别,有些产品具有 如此之多的 属性,这些属性对于任何其他产品都是不常见的。我可以看到这个项目变得非常复杂,考虑到我什至以 900 美元的价格出价,我不得不以某种方式简化它。

这是我想出来的,并得到了客户的认可。

当前列

+--------------------------+--------------+------+-----+---------+-------+
| Field                    | Type         | Null | Key | Default | Extra |
+--------------------------+--------------+------+-----+---------+-------+
| Datasheets               | varchar(128) | YES  |     | NULL    |       |
| Image                    | varchar(85)  | YES  |     | NULL    |       |
| DigiKey_Part_Number      | varchar(46)  | YES  |     | NULL    |       |
| Manufacturer_Part_Number | varchar(47)  | YES  |     | NULL    |       |
| Manufacturer             | varchar(49)  | YES  |     | NULL    |       |
| Description              | varchar(34)  | YES  |     | NULL    |       |
| Quantity_Available       | int(11)      | YES  |     | NULL    |       |
| Minimum_Quantity         | int(11)      | YES  |     | NULL    |       |
+--------------------------+--------------+------+-----+---------+-------+

因此所有产品都适合此页面模板(屏幕截图中底部的菜单有误):

关闭自动完成 Table?

在设计的早期,我实现了一个很好的自动完成功能:

BUT .. given the number of products in the table, is this even practical anymore ???

最终产品数量: 223,347

我需要对 PRODUCTS table 进行哪些更改,以便查询 table 不会花很长时间?

这些是应用程序将进行的唯一查询(不确定此信息是否有助于您的解决方案建议)...

  1. 按类别获取所有产品: Select * 来自类别 = 'semiconductors'

    的产品
  2. 获取单品: Select * 来自 Manufacturer_Part_Number = '12345'

    的产品
  3. 按类别获取产品数量

我认为这三个实际上涵盖了我需要做的一切。可能还有几个,但不会很多。

收盘中...

有没有一种方法可以用 223000 条记录“索引”这个 table,从而可以高效地按一列或多列进行搜索?

我是数据库设计的新手,我知道我确实需要索引一些东西,但是......什么???

感谢您花时间看这篇文章post。

此致,

约翰

必须列出查询才能回答您的问题。感谢包括他们。

INDEX(category)
INDEX(Manufacturer_Part_Number)

但我建议您的第二个查询也应该包括 Manufacturer。那这样就更好了:

INDEX(Manufacturer, Manufacturer_Part_Number)

一切NULL?似乎不太可能。

(我做过像你这样的工作;我无法想象只出价 900 美元就可以完成所有这些刮擦。)

当一个类别或制造商有上千个项目时,你会怎么做?带有 thousand-item 列表的 UI 糟透了。

关于如何处理“如此多的属性”,我建议 http://mysql.rjweb.org/doc.php/eav(我应该向你收取 899 美元用于该文档的研究。开玩笑。)

他们不需要其他查找,比如“闪存驱动器”,需要匹配“FLASH DRV”吗?

223K 行 -- 没问题。 VARCHARs 好像太短了;他们是基于数据吗?

而 table 需要一个 PRIMARY KEY