Эта ошибка может возникнуть при попытке установить pycurl
.
В этом случае вы должны сделать
sudo apt-get install libcurl4-gnutls-dev librtmp-dev
(основанный здесь: https: // gist.github.com/lxneng/1031014)
Относительно UNION
UNION DISTINCT
(значение по умолчанию для UNION
) обязательно медленнее, потому что оно должно собрать два результата, затем dedup. Однако с тех пор там меньше возвращается клиенту, там мог некоторая компенсация там. UNIONs
не включили временную таблицу для сбора результатов, следовательно UNION
было обязательно медленнее, чем два отдельных SELECTs
. Недавно, (MySQL 5.7, MariaDB 10.1) некоторые случаи UNION ALL
были улучшены, чтобы освободить данные из одного SELECT
прямо клиенту, затем поставить другим. SELECT .. UNION SELECT .. ORDER BY ..
эквивалентно [1 120] (SELECT .. UNION SELECT ..) ORDER BY ..
- это (SELECT ..) UNION (SELECT .. ORDER BY ..)
- не это SELECT
. SELECT
с OR
может быть ускорен, превратив его в UNION
, таким образом, позволив двум индексам использоваться. Относительно тестирования:
SQL_NO_CACHE
. WHERE flag = true (or false)
имеет несколько случаев: flag
индексируется? flag
почти всегда одно из тех значений? В [1 128], что случай, индекс будет использоваться, и , вероятно быстрее, чем другой случай. ОБЪЕДИНЕНИЕ ВСЕ быстрее, чем ОБЪЕДИНЕНИЕ, потому что плоскость UNION ожидает, что в двух наборах данных, к которым присоединяются, дубликаты, которые должны быть удалены. Если можно удостовериться (внутренними операторами Where), что не будет никаких дубликатов, намного лучше использовать ОБЪЕДИНЕНИЕ ВЕСЬ и позволить механизму базы данных оптимизировать внутренние выборы.
Используя оператор Where на результате сгруппированных результатов является слишком дорогим, потому что Вы воздействуете на большее количество внутренних результатов, чем Вам нужно. Кроме того, оптимизация механизма базы данных can’t быть обработанной — результаты не имеет ничего общего.
проверка эта ссылка для деталей https://dzone.com/articles/performance-tip-for-tuning-sql-with-union
Предположение: Поскольку вы запрашиваете одну таблицу с двумя объединениями, возможно, что mysql испытывает трудности с определением стратегии блокировки для таблицы, или он пытается выполнить кеширование, которое здесь не работает, поскольку вы запрашиваете непересекающиеся наборы, пытается многопоточно доступ (очень разумный), но сталкивается с некоторыми проблемами блокировки / параллелизма / поиска файлов.
объединения могут также обычно использовать более высокие настройки безопасности, поскольку эти два выбора должны быть согласованными. Если вы поместите их в отдельные транзакции, они этого не сделают.
Эксперимент: Сделайте копию таблицы и объедините их. Если я прав, это должно быть быстрее.
Возможное решение: Разделите один файл на несколько файлов, чтобы обеспечить лучшие стратегии параллелизма. Это не / не должно помочь с проблемами блокировки, но исключает проблемы многопоточности / поиска в базе данных.
Было бы полезно знать, какой механизм хранения вы используете.
Ну, только мои 2 цента. Не могу сейчас проверить это здесь.
Когда я оптимизирую свои 2 отдельных запроса для выполнения менее чем за 0,02 секунды, а затем их СОЮЗИРУЮ, результат выполнения запроса занимает более 1 секунды.
Ваши запросы включают ORDER BY … LIMIT
предложения?
Если вы поместите ORDER BY… LIMIT
после UNION
, он будет применен ко всему UNION
и индексам не может использоваться в этом случае.
Если id
является первичным ключом, этот запрос будет мгновенным:
SELECT *
FROM table
ORDER BY id
LIMIT 1
, но не будет:
SELECT *
FROM table
UNION ALL
SELECT *
FROM table
ORDER BY id
LIMIT 1
Кроме того,
UNION ALL
занимает больше времени, чемUNION DISTINCT
. Я предполагаю, что разрешение дубликатов заставит запрос выполняться быстрее, а не медленнее.
Это также, похоже, связано с ORDER BY
. Сортировка меньшего набора происходит быстрее, чем большего.
Неужели мне лучше запустить два запроса отдельно? Я бы предпочел использовать
UNION
. Вам нужно, чтобы полученный набор был отсортирован?
Если нет, просто избавьтесь от последнего ORDER BY
.
Может быть, вы измеряете время ответа, а не время для получения всех данных?