|
|
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
Привет! У меня есть простая задача, я изложу свое решение, и задам вам вопрос: не знаете ли вы решения лучше? Есть два отношения t1 и t2, и есть отношение t1_t2 для связи атрибутов из t1 и t2: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Тип данных 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 сек ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2013, 18:05 |
|
||
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
из всего вышеуказанного не понятно зачем вам поле t1_id в t1 если ключ у вас main_search_attr Тащите его в кросс-таблицу t1_t2 И указывая общее количество строк в таблицах вы забыли указать сколько строк должен возвращать типичный/средний запрос. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2013, 19:24 |
|
||
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
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. 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 Вашей точки зрения, насколько корректное решение я предложил? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2013, 20:06 |
|
||
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
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) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2013, 20:14 |
|
||
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
moonglowя посчитал, что 5 000 000 дупликатов, по которым нужно искать, будучи MEDIUMINT - лучше, чем 5 000 000 дупликатов VARCHAR(45) неправильно делаю? Код: sql 1. возвращает, в среднем, 10-20 кортежей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.04.2013, 20:26 |
|
||
|
Прошу совет по оптимизации на уровне архитектуры БД
|
|||
|---|---|---|---|
|
#18+
Что-то сумбурно как-то. Изложите еще раз аккуратно - что за задача (вставляем, удаляем, ищем), начальные условия. Варианты решения Решение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 неправильно делаю?Я бы от критериев правильно/не_правильно перешел к критериям выгодно/невыгодно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 08.04.2013, 18:37 |
|
||
|
|

start [/forum/topic.php?fid=32&msg=38216237&tid=1541306]: |
0ms |
get settings: |
6ms |
get forum list: |
18ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
88ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 223ms |
| total: | 410ms |

| 0 / 0 |
