powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации на уровне архитектуры БД
6 сообщений из 6, страница 1 из 1
Прошу совет по оптимизации на уровне архитектуры БД
    #38216237
moonglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Привет!

У меня есть простая задача, я изложу свое решение, и задам вам вопрос: не знаете ли вы решения лучше?

Есть два отношения t1 и t2, и есть отношение t1_t2 для связи атрибутов из t1 и t2:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TABLE t1 (
main_search_attr VARCHAR(45) PRIMARY KEY,
t1_id MEDIUMINT UNSIGNED NOT NULL 
) ENGINE=MyISAM;

CREATE TABLE t2 (
t2_id MEDIUMINT UNSIGNED PRIMARY KEY,
.... другие атрибуты, не важно
) ENGINE=MyISAM;

CREATE TABLE t1_t2 (
t1_id MEDIUMINT UNSIGNED NOT NULL,
t2_id MEDIUMINT UNSIGNED PRIMARY KEY
) ENGINE=MyISAM;



Тип данных main_search_attr VARCHAR(45) менять нельзя, все остальное - можно.

В t1 есть 10 000 000 кортежей.

Наиболее часто выполняемый поиск == SELECT * FROM t1 WHERE main_search_attr LIKE 'текст123%';

Он выполняется за 0.01 сек с B-TREE индексом main_search_attr, это меня устраивает.

Одному t1.main_search_attr может соответствовать от 1 до N t2.t2_id

По-этому, в отношении t1_t2 может содержаться примерно 15 000 000 кортежей.

До создания отношения t2 и тестов написанного выше решения руки пока не дошли из-за других причин.

Я думаю создать комбинированный B-TREE индекс (main_search_attr,t1_id) в t1 - в этом действии меня смущает то, что я совмещаю в индексе VARCHAR PRIMARY KEY и MEDIUMINT

Я думаю создать комбинированный B-TREE индекс (t1_id,t2_id) в t1_t2

и выполнить поиск SELECT t1_t2.t2_id FROM t1_t2 INNER JOIN t1 ON t1_t2.t1_id=t1.t1_id WHERE t1.main_search_attr LIKE 'текст123%';

В результате я хочу получить польный список t2_id, соответствующих найденным main_search_attr, за всремя, не превышающее 0.05 сек
...
Рейтинг: 0 / 0
Прошу совет по оптимизации на уровне архитектуры БД
    #38216286
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
из всего вышеуказанного не понятно зачем вам поле t1_id в t1 если ключ у вас main_search_attr
Тащите его в кросс-таблицу t1_t2

И указывая общее количество строк в таблицах вы забыли указать сколько строк должен возвращать типичный/средний запрос.
...
Рейтинг: 0 / 0
Прошу совет по оптимизации на уровне архитектуры БД
    #38216305
moonglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257из всего вышеуказанного не понятно зачем вам поле t1_id в t1 если ключ у вас main_search_attr
Тащите его в кросс-таблицу t1_t2

И указывая общее количество строк в таблицах вы забыли указать сколько строк должен возвращать типичный/средний запрос.

Значение атрибута main_search_attr связано с несколькими t2_id

я немного пересмотрел идею о индексах, получилась такая:

создаем два индекса в отношении t1
первый индекс - по main_search_attr VARCHAR(45) PRIMARY KEY
вторй индекс - по t1_id MEDIUMINT UNSIGNED NOT NULL

и создаем два индекса в отношении t1_t2
первый индекс - по t1_id MEDIUMINT UNSIGNED NOT NULL,
второй индекс - по t2_id MEDIUMINT UNSIGNED PRIMARY KEY

тогда в отношениях t1 и t1_t2 будет одинаковый индекс - по t1_id MEDIUMINT UNSIGNED NOT NULL

второй индекс в t1_t2 - для обратного поиска main_search_attr по t2_t1

для того, чтобы в запросе
Код: sql
1.
SELECT t1_t2.t2_id FROM t1_t2 INNER JOIN t1 ON t1_t2.t1_id=t1.t1_id WHERE t1.main_search_attr LIKE 'текст123%';


WHERE clause выполнялось по индексу main_search_attr
и JOIN выполнялся по индексу t1_id

Не создавать "еще одну таблицу" t1_t2 c 15 000 000 кортежей не получится, потому что иначе придется отказаться от PRIMARY KEY в t1, и ввести дупликаты main_search_attr для всех значений, у которых одинаковый main_search_attr и разые t2_id
На практике, введение первичного ключа дало оптимизацию в 0.5 сек.
Еще один аргумент в пользу создания t1_t2 - дупликаты в t1 значения VARCHAR(45) - дорогостоящие

C Вашей точки зрения, насколько корректное решение я предложил?
...
Рейтинг: 0 / 0
Прошу совет по оптимизации на уровне архитектуры БД
    #38216310
moonglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SERG1257из всего вышеуказанного не понятно зачем вам поле t1_id в t1 если ключ у вас main_search_attr
Тащите его в кросс-таблицу t1_t2

И указывая общее количество строк в таблицах вы забыли указать сколько строк должен возвращать типичный/средний запрос.
Ой, прошу прощения, не дописал к предыдущему сообщению:

Идея как раз в том, чтобы от дорогостоящего VARCHAR(45) перейти к MEDIUMINT t1_id
и t1_id в кросс таблице будет иметь множество дупликатов
я посчитал, что 5 000 000 дупликатов, по которым нужно искать, будучи MEDIUMINT - лучше, чем 5 000 000 дупликатов VARCHAR(45)
...
Рейтинг: 0 / 0
Прошу совет по оптимизации на уровне архитектуры БД
    #38216315
moonglow
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
moonglowя посчитал, что 5 000 000 дупликатов, по которым нужно искать, будучи MEDIUMINT - лучше, чем 5 000 000 дупликатов VARCHAR(45)
неправильно делаю?

Код: sql
1.
SELECT * FROM t1 WHERE main_search_attr LIKE 'текст123%';


возвращает, в среднем, 10-20 кортежей
...
Рейтинг: 0 / 0
Прошу совет по оптимизации на уровне архитектуры БД
    #38217806
SERG1257
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то сумбурно как-то.
Изложите еще раз аккуратно - что за задача (вставляем, удаляем, ищем), начальные условия.
Варианты решения
Решение1 - достоинства, недостатки, возможные грабли, способы их обхода
Решение2 - достоинства, недостатки, возможные грабли, способы их обхода

Тогда публика сможет предложить свое решение вышеуказанной задачи, или поддержать ваше, добавить аргументов.

Пока что я понял.
1 Вы собираетесь вместо "естественного" ключа main_search_attr сделать суррогатный t1_id в таблице t1.
Не вижу возражений.
2 Добавить t1_id к уникальному индексу по main_search_attr.
В этом случае вы теряете ошибку при вставке дубликата main_search_attr, но получаете возможность (если mysql это умеет, надо проверять) избежать скана таблицы t1, так как данные t1_id уже будут в индексе.
3 Создать два уникальных индекса на кросс таблицу t1_t2 - t1_id,t2_id и t2_id,t1_id
Тоже не вижу возражений.
4 Считаете дорогим держать main_search_attr в кросстаблице.
Однако это в худшем случае 45*15М будет около 675Мб против 4*15М=60Мб - не смертельно.
Другое дело, что эти мегабайты будут не только на диске, но и в памяти, меньше будет влезать строк в блок, они будут занимать место в бакапе и т.д.
moonglow неправильно делаю?Я бы от критериев правильно/не_правильно перешел к критериям выгодно/невыгодно
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Проектирование БД [игнор отключен] [закрыт для гостей] / Прошу совет по оптимизации на уровне архитектуры БД
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]