优化数据库
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 种解决问题的方法:
在我的框定义table中,添加细节的几何信息。但这是正确的吗,因为这意味着复制 table 中的所有定义。
提出一个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 编辑 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 将在查询中使用它之前对其进行排序。
我对如何优化我的数据库有疑问:
我有一个第一个 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 种解决问题的方法:
在我的框定义table中,添加细节的几何信息。但这是正确的吗,因为这意味着复制 table 中的所有定义。
提出一个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 编辑 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 将在查询中使用它之前对其进行排序。