Оптимизация таблиц базы данных MySQL для FASTER Querying & Performance - PullRequest
0 голосов
/ 04 июня 2019

У меня есть 2 таблицы в моей базе данных MySQL. Давайте назовем 1-й main, 2-й final.

TABLE `main` has the structure         |    TABLE `final` has the structure
                                       |
`id` --> PRIMARY KEY (Auto Increment)  |    `id` --> PRIMARY KEY (Auto Increment)
                                       |    `id_main` -->  ?? (Need help here)
                                       |
id | name    | info                    |     id | id_main | name    | info(changed)
---------------------                  |     ---------------------------------------
1  | Peter   | 5,9                     |     1 |    2     | Butters  | 0.3,34
2  | Butters | 3,3                     |     2 |    4     | Stewie   | 1.2,4.4
3  | Stan    | 2,96                    |     3 |    1     | Peter    | 5.7,0.9
4  | Stewie  | 1,84                    |     4 |    3     | Stan     | 4.8,0.74

После анализа данных в main результаты помещаются в final. Как видите, у final есть дополнительный столбец (id_main), который указывает на main. id

На самом деле каждая из этих таблиц состоит из 100 миллионов + строк, моя проблема возникает при выполнении запросов SQL.

Как настроить final, особенно (id & id_main), чтобы запросы от main до final были самыми быстрыми.

Могу ли я покончить с final.id (ПЕРВИЧНЫЙ КЛЮЧ, автоинкремент) и сохранить final.id_main (Как УНИКАЛЬНЫЙ Индекс?)

OR

Должен ли я оставить id КАК ПЕРВИЧНЫЙ КЛЮЧ (AI) & final.id_main КАК УНИКАЛЬНЫЙ ИНДЕКС?

Я бы звонил как:

int id_From_Main= 10000;
SELECT `id_main` FROM `final` WHERE `id`='"+id_From_Main+"'

Ответы [ 2 ]

0 голосов
/ 04 июня 2019

Если между этими таблицами есть отношение 1: 1, я не вижу никакой причины, по которой им понадобятся два отдельных первичных ключа с автоинкрементом.

Я бы удалил столбец final.id и получил быfinal.id_main как первичный ключ без автоинкрементации и внешний ключ к столбцу main.id.

В общем случае вы также можете иметь таблицу без первичного ключа вообще.Это зависит от того, хотите ли вы иметь возможность выбирать отдельные отдельные строки или нет.

Я не понимаю ваш запрос SELECT id_main FROM final WHERE id = '"+id_From_Main+"' - вы пытаетесь выбрать значение идентификатора из основного по идентификатору из основного,Какова цель, почему вы пытаетесь получить значение, которое у вас уже есть?

В любом случае, вы не предоставляете достаточно информации, чтобы дать вам квалифицированный ответ.Вы должны оптимизировать свои структуры данных в соответствии с запросами, которые вы будете выполнять.

Убедитесь, что у вас есть индексы для столбцов, которые вы используете в предложении WHERE.Если вы выбираете по final.id_main, укажите индекс в этом столбце.Если вы выбираете по final.id_main и final.name, у вас есть составной индекс для обоих столбцов и т. Д.

Вам действительно нужно иметь столбец name в обеих таблицах?Это плохой дизайн базы данных, если только не происходит оптимизация производительности (чтобы избежать объединения).

Итак, вам следует:

  1. собрать все запросы, которые вы используете в данный момент, установить правильные индексыв соответствии с ними
  2. удалите все ненужные столбцы (например, final.id, final.name)
  3. , используйте EXPLAIN в своих запросах для получения информации об исполнении (вы можететакже используйте Explain Analyzer , чтобы помочь вам интерпретировать результаты)
  4. вы можете попробовать профилирование запроса
0 голосов
/ 04 июня 2019

В mysql вы должны определить id как PK, потому что это auto_increment.Определите id_main как UNIQUE.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...