Оптимизация запроса MySQL LEFT JOIN для простой схемы из трех таблиц?

Решение, которое работает как с аргументами positional, так и с ключевыми словами независимо от порядка, в котором были переданы ключевые слова args (используя inspect.getargspec ):

import inspect
import functools

def memoize(fn):
    cache = fn.cache = {}
    @functools.wraps(fn)
    def memoizer(*args, **kwargs):
        kwargs.update(dict(zip(inspect.getargspec(fn).args, args)))
        key = tuple(kwargs.get(k, None) for k in inspect.getargspec(fn).args)
        if key not in cache:
            cache[key] = fn(**kwargs)
        return cache[key]
    return memoizer

Аналогичный вопрос: Идентификация эквивалентных функций функции varargs для memoization в Python

2
задан Adrian 18 January 2019 в 11:19
поделиться

3 ответа

18 января 2019 г. в 13:43 На данный момент вам нужны два индекса, чтобы покрыть основное правило ОБА левому и правому объектам JOIN = нужен индекс. 1. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_job_id (job_id) 2. ALTER TABLE tbl_workermap ДОБАВИТЬ ИНДЕКС idx_t_w_map_wrk_user_id (worker_user_id) после создания, запустить EXPLAIN ..... для просмотра нового плана выполнения.

0
ответ дан Wilson Hauck 18 January 2019 в 11:19
поделиться

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

Если бы этот вопрос касался Microsoft SQL Server , я бы порекомендовал создание хранимой процедуры, особенно если этот запрос выполняется часто как некий регулярный процесс. Как отмечалось в в этом ответе , однако, основное преимущество в производительности для простых запросов, подобных этому, будет зависеть от дизайна таблицы и индексов.

0
ответ дан Paul 18 January 2019 в 11:19
поделиться
1112 «Работа может иметь одного или нескольких работников». А как же наоборот (работник может быть на нескольких работах)? Если нет, то у вас есть только 1: много, и вы не должны реализовывать это с этой дополнительной таблицей.

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

Не используйте LEFT, если вы не ожидаете, что в «правильной» таблице пропущена нужная строка.

Совет по стилю: избавьтесь от tbl_, user_ (за исключением user_id) и т. Д. То есть префиксы в именах являются беспорядочными и избыточными в контексте. Будьте последовательны в отношении «пользователь» и «работник».

Иметь таблицу «многие: многие» с именами обеих целей (например, worker_job). Однако теперь я вижу, что это больше, чем просто таблица сопоставления многих: многих; это больше похоже на таблицу для назначения и отслеживания того, кто над чем работает со временем ?

Если вам нужно и история того, кто работал над чем и Текущее состояние тех, кто над чем работает, рассмотрим наличие двух таблиц. История продолжает расти; «ток» постоянно меняется.

Используйте подходящие типы данных, такие как DATE и DATETIME.

Используйте InnoDB вместо MyISAM.

0
ответ дан Rick James 18 January 2019 в 11:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: