Оптимизация базы данных

#c# #mysql #sentence

#c# #mysql #предложение

Вопрос:

У меня вопрос о том, как оптимизировать мою базу данных :

У меня есть первая таблица, в которой я задаю список элементов (табличек) со всеми его геометрическими определениями, который выглядит так :

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

Затем во второй таблице у меня есть список блоков (на самом деле это большие таблицы, в которые входят таблицы 1-й таблицы, я называю это box, чтобы не вносить путаницу), в каждом поле у меня есть список элементов внутри, и я определяю его следующим образом.

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

Я не ссылаюсь на идентификатор, но на КОНТРАКТ и ИМЯ, это добровольно (первая таблица — это только таблица с геометрическими определениями).

Проблема в том, что у меня есть ListView со списком полей, и когда я нажимаю на одно поле, мне нужно отобразить все элементы внутри поля. На данный момент я просто делаю что-то подобное :

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

Редактировать: Забыл сказать, моя функция GetGeometry — это просто SQL-запрос «SELECT * FROM DEFINITION_TABLE ГДЕ CONTRACT=’C1′ И NAME =’D001′.

Это работает хорошо, но когда у меня есть большая таблица с сотнями элементов внутри, она очень длинная, так как она выполняет сотни запросов SELECT.

Я вижу 2 способа решения проблемы :

  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')...
  

Но в случае, если у меня есть сотни деталей, предложение будет очень длинным.

Я чувствую, что 1-й вариант не является хорошим и может использовать 2-й. Что бы вы посоветовали по этому поводу? Нормально ли составлять такое длинное предложение для MySQL? Я ограничен по длине предложения?

Редактировать: Спасибо @Akina за редактирование сообщения, не могли бы вы объяснить, как вы добавили пробелы в таблицу? Я добавил пробелы, но стек автоматически удалил их все?

Комментарии:

1. Я чувствую, что 1-й вариант не является хорошим и может использовать 2-й. Ваши запросы НЕ эквивалентны. У вас нет «опций» — у вас есть по крайней мере один (и даже, возможно, оба) нелогичных запроса.

2. @Akina сначала спасибо за редактирование (не смог сам добавить пробелы), затем я понимаю, что 3-й запрос не является полностью «правильным», и ему потребуется второй фильтр на уровне кода. Так что 2-й был бы хорошим. Но нормально ли делать такой длинный запрос для MySQL? Я имею в виду, если у меня есть 200 элементов, например.

3. Используйте форму WHERE (CONTRACT, NAME) IN (('C1','D001'), ('C1','D003'), ('C2','D003'), ...) — она занимает меньше байтов. можно ли делать такой длинный запрос для MySQL? Ищите max_allowed_packet значение — размер текста вашего запроса не должен превышать его (по умолчанию он равен 64 Мбайт). Помните — если ваш список литералов превышает ~ 10 элементов, MySQL отсортирует его перед использованием в запросе.

4. Спасибо, не знал этого синтаксиса … Не могли бы вы написать это как ответ, чтобы я мог закрыть вопрос, пожалуйста?

5. Не убежден представленной вами моделью данных. В этих таблицах нет / нет общих столбцов, которые позволили бы успешно выполнить операцию объединения.

Ответ №1:

Используйте форму

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

это занимает меньше байтов.

можно ли делать такой длинный запрос для MySQL?

Ищите max_allowed_packet значение — размер текста вашего запроса не должен превышать его (по умолчанию он равен 64 Мбайт).

Помните — если ваш список литералов превышает ~ 10 элементов, MySQL отсортирует его перед использованием в запросе.