优化数据库

时间:2020-10-02 11:44:43

标签: c# mysql sentence

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

我有第一个表,在其中设置了具有所有几何定义的元素(板)列表,如下所示:

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

然后在第二张桌子上,我有一个盒子列表(实际上,它们是大盘子,其中放着第一张桌子的盘子,我称它为“不要混淆”盒子),在每个盒子里我都有一个元素列表里面,并像这样定义它。

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

我没有链接ID,但在CONTRACT和NAME上却是自愿的(第一个表只是具有几何定义的表)。

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

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

编辑:忘了说,我的函数GetGeometry只是一个SQL请求“ SELECT * FROM DEFINITION_TABLE WHERE CONTRACT ='C1'AND NAME ='D001'。

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

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

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

  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编辑帖子,能否请您解释一下如何在表中添加空格?我添加了空格,但是堆栈会自动删除所有空格?

1 个答案:

答案 0 :(得分:2)

使用表格

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

占用更少的字节。

可以对MySQL进行如此长的查询吗?

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

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