优化数据库

Optimization database

我对如何优化我的数据库有疑问:

我有一个第一个 table,我在其中设置了一个元素(板)列表及其所有几何定义,看起来像这样:

CONTRACT | NAME | CONTOURS |  HOLES  | SCRIBING
C1       | D001 | bigString|bigString|bigString
C1       | D003 | bigString|bigString|bigString
C2       | D003 | bigString|bigString|bigString
...

然后在第二个 table,我有一个盒子列表(实际上它们是大盘子,其中包含第一个 table 的盘子,我称它为盒子以免混淆) ,在每个盒子里我都有一个元素列表,并像这样定义它。

ID     | NAME | NAME_ELEMENT | CONTRACT_ELEMENT| QUANTITY | 
10001  | BOX1 |         D001 |               C1|     100  |
10001  | BOX1 |         D003 |               C1|     100  |
10001  | BOX1 |         D003 |               C2|     100  |
...

ID上我没有link,但是CONTRACT和NAME上是自愿的(第一个table只是几何定义的table)

问题是我有一个带有框列表的 ListView,当我单击一个框时,我需要显示框内的所有元素。 现在我只是做类似的事情:

    foreach(Plate plate in contexte.SelectedBox)
    {
       plate.GetGeometry();
    }

Edit : 忘了说了,我的函数 GetGeometry 只是一个 SQL 请求 "SELECT * FROM DEFINITION_TABLE WHERE CONTRACT='C1' 和姓名='D001'.

效果很好,但是当我有一个大盘子,里面有数百个元素时,它会很长,因为它会发出数百个 SELECT 请求。

我看到了 2 种解决问题的方法:

  1. 在我的框定义table中,添加细节的几何信息。但这是正确的吗,因为这意味着复制 table 中的所有定义。

  2. 提出一个SQL请求类型

SELECT * 
FROM TABLE_DEFINITION 
WHERE (CONTRACT='C1' OR CONTRACT='C2') AND (NAME='D001' OR NAME='D003'...)
  1. 请求可能是
SELECT * 
FROM TABLE_DEFINITION 
WHERE (CONTRACT='C1' AND NAME='D001') OR (CONTRACT='C1' AND NAME='D003') OR (CONTRACT='C2' AND NAME='D003')...

但是如果我有数百个细节,那么句子会很长。

感觉第一个不太好,可以用第二个。你对此有何建议? MySQL这么长的句子可以吗?我的句子长度有限制吗?

编辑:感谢@Akina 编辑 post,能否请您解释一下您是如何在 table 中添加空格的?我添加了空格,但堆栈自动将它们全部删除?

使用表格

WHERE (CONTRACT, NAME) IN (('C1','D001'), ('C1','D003'), ('C2','D003'), ...)

它占用更少的字节。

is it ok to make such a long query for MySQL?

查找 max_allowed_packet 值 - 您的查询文本大小不得超过它(默认情况下为 64 MB)。

记住 - 如果您的文字列表超过 ~10 个元素,MySQL 将在查询中使用它之前对其进行排序。