我对如何优化数据库有疑问:
我有第一个表,在其中设置了具有所有几何定义的元素(板)列表,如下所示:
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请求。
我看到了两种解决问题的方法:
在我的框定义表中,添加详细信息的几何信息。但这是正确的,因为这意味着复制两个表中的所有定义。
使SQL请求类型
SELECT *
FROM TABLE_DEFINITION
WHERE (CONTRACT='C1' OR CONTRACT='C2') AND (NAME='D001' OR NAME='D003'...)
SELECT *
FROM TABLE_DEFINITION
WHERE (CONTRACT='C1' AND NAME='D001') OR (CONTRACT='C1' AND NAME='D003') OR (CONTRACT='C2' AND NAME='D003')...
但是在我有数百个细节的情况下,句子会很长。
我觉得第一种选择不是好的选择,可以使用第二种选择。您对此有何建议? MySQL这样长的句子可以吗?我的句子长度受限制吗?
编辑:感谢@Akina编辑帖子,能否请您解释一下如何在表中添加空格?我添加了空格,但是堆栈会自动删除所有空格?
答案 0 :(得分:2)
使用表格
WHERE (CONTRACT, NAME) IN (('C1','D001'), ('C1','D003'), ('C2','D003'), ...)
占用更少的字节。
可以对MySQL进行如此长的查询吗?
寻找max_allowed_packet
值-您的查询文本大小不得超过该值(默认为64 MB)。
请记住-如果您的文字列表超过10个元素,MySQL将在查询中使用它之前对其进行排序。