ПредыдущийУказано, что существует недавний спрос, чтобы изменить существующую структуру хранения, включающую консолидацию условий запроса и эффективность запроса, прочитать несколько статей, связанных с ними индексов, а также связанные со связанными знаниями, в сочетании с потребностями проекта, говорят об их понимании и суммируем Отказ
Общий каталог выглядит следующим образом: выше представлены первые 3 раздела, в которых анализируется, почему индекс работает быстро, обобщаются его преимущества и категории, а также процесс эволюции индекса. В промежуточной книге основное внимание будет уделено методам анализа индекса и общей оптимизации индекса.
- Зачем нужен индекс
- индексированная категория
- Эволюция индекса MySQL
- Оптимизация индекса MySQL
- Введение в HBase
- Структура хранилища HBase
- Введение в индексы HBase
- Бизнес-требования и дизайн
Часть контента взята из статей нескольких блоггеров, и, наконец, будет дана ссылка на статью, чтобы поблагодарить их за прекрасный анализ.
Через введение вы узнаете:
- Процесс запроса MySQL
- Понятия, связанные с расширенными запросами
- объясни команду подробно
- Рекомендации по оптимизации индекса
Процесс запроса MySQL
Чтобы лучше оптимизировать запрос, вы должны сначала понять весь процесс запроса.От отправки клиентом запроса на запрос до получения результата запроса сервер MySQL проделал большую работу.
логическая архитектура
Общая логическая архитектура MySQL разделена на три уровня, а именно уровень клиента, уровень ядра службы и уровень механизма хранения, которые выполняются совместно.
Верхний уровень — это клиентский уровень, такой как обработка соединений, авторизация и аутентификация, безопасность и другие функции.
Средний уровень — это основная служба MySQL, включающая разбор запросов, анализ, оптимизацию, кэширование, встроенные функции (такие как: время, математика, шифрование и т. д.) Кроме того, также реализованы все функции кросс-хранилища. в этом слое: хранимые процедуры, триггеры, представления и т. д.
Самый нижний механизм хранения данных для хранения данных и поиска данных, промежуточный слой службы в связи с API механизма хранения, интерфейсы API экранированные различия между различными двигателями хранения.
Конкретный процесс выполнения
Давайте сосредоточимся на том, как MySQL оптимизирует и выполняет запросы.Большая часть работы по оптимизации запросов заключается в следовании некоторым принципам, чтобы заставить оптимизатор MySQL работать должным образом.
Давайте сначала поговорим об общем процессе:
- Клиент отправляет SQL-запрос на сервер;
- Сервер сначала проверяет кеш запроса, и если он попадает в кеш, он немедленно возвращает результат, хранящийся в кеше;
- Сервер выполняет синтаксический анализ и предварительную обработку SQL, а оптимизатор генерирует соответствующий план выполнения;
- Механизм выполнения запросов вызывает API механизма хранения для выполнения запроса в соответствии с планом выполнения, сгенерированным оптимизатором;
- Вернуть результат к клиенту;
1. Протокол клиент/сервер
Протокол связи между клиентом и сервером MySQL является «полудуплексным»: в любой момент либо сервер отправляет данные клиенту, либо клиент отправляет данные на сервер, что не может происходить одновременно, а это означает, что не является методом управления потоком.
Клиент отправляет запрос на сервер с одним пакетом данных.Сервер отвечает пользователю с большим количеством данных, которые состоят из нескольких пакетов данных.Следует отметить, что когда сервер отвечает на запрос клиента, клиент должен получить его полностью.Возвращается весь результат, вместо того, чтобы просто взять первые несколько результатов и позволить серверу прекратить отправку.
2. Кэш запросов
Если кеш запросов открыт, он проверит, соответствует ли оператор запроса данным в кеше запросов.Если он попадает, результат в кеше будет возвращен сразу после проверки разрешения пользователя один раз.
Система Query Cache будет отслеживать каждую таблицу, участвующую в запросе. Во время любой операции записи MySQL должен сделать недействительным все кэширования соответствующей таблицы. Если кэш запроса очень большой или фрагментированный, эта операция может принести много расхода системы.
Кроме того, любое утверждение запроса должно быть проверено перед началом, даже если это оператор SQL никогда не попадет в кеш, если результат запроса может быть кэширован, то после завершения выполнения результат будет храниться в кэше, который принесет Дополнительное потребление системы.
Таким образом, вы должны быть осторожны при открытии кеша. Только когда экономия ресурсов, обеспечиваемая кешем, больше, чем ресурсы, которые он потребляет, это приведет к улучшению производительности системы. Вы можете установить для query_cache_type значение DEMAND, тогда только запросы, которые присоединяются к SQL_CACHE пойдет в кеш, других запросов не будет.
3. Разбор синтаксиса и предварительная обработка
Оператор SQL анализируется по ключевым словам для создания дерева синтаксического анализа, а предварительная обработка дополнительно проверяет, является ли дерево синтаксического анализа допустимым в соответствии с правилами MySQL.
4. Оптимизация запросов
Запрос может быть выполнен многими способами. Роль оптимизатора состоит в том, чтобы найти лучший план выполнения среди них. MySQL использует оптимизатор на основе затрат, который пытается предсказать стоимость запроса, используя определенный план выполнения, и выбирает оптимальный самая низкая стоимость среди них.
Механизм выполнения запросов
Интерфейс механизма хранения предоставляет очень богатые функции, но на нижнем уровне всего несколько десятков интерфейсов, и эти интерфейсы выполняют большинство операций запроса, например строительные блоки.
6. Вернуть результат клиенту
Возврат результирующего набора клиенту — это инкрементный и пошаговый процесс, так что серверу не нужно хранить слишком много результатов и потреблять слишком много памяти, а клиент может получить возвращенные результаты как можно скорее.
ВЫБЕРИТЕ порядок выполнения
Давайте посмотрим на последовательность выполнения оператора SQL-запроса.Каждый шаг будет генерировать виртуальную временную таблицу в качестве входных данных для следующего шага.
Стандартный синтаксис SQL выглядит следующим образом:
SELECT DISTINCT
< select_list >
FROM
< left_table > < join_type >
JOIN < right_table > ON < join_condition >
WHERE
< where_condition >
GROUP BY
< group_by_list >
HAVING
< having_condition >
ORDER BY
< order_by_condition >
LIMIT < limit_number >
Однако порядок выполнения следующий:
FROM
<left_table>
ON <join_condition> <join_type>
JOIN <right_table>
WHERE
<where_condition>
GROUP BY
<group_by_list>
HAVING
<having_condition>
SELECT
DISTINCT
<select_list>
ORDER BY
<order_by_condition>
LIMIT
<limit_number>
1.FROM
Когда задействовано несколько таблиц, выходные данные левой таблицы будут использоваться в качестве входных данных для правой таблицы, а затем будет сгенерирована виртуальная таблица VT1:
- Вычислить декартово произведение (CROSS JOIN) двух связанных таблиц для создания виртуальной таблицы VT1-J1;
- Отфильтровать на основе виртуальной таблицы VT1-J1, отфильтровать все строки, удовлетворяющие условию предиката ON, и сгенерировать виртуальную таблицу VT1-J2;
- Если используется внешнее соединение (LEFT, RIGHT, FULL), столбцы в основной таблице (зарезервированной таблице), которые не соответствуют условию ON, также будут добавлены в VT1-J2 для создания виртуальной таблицы VT1-J3;
2.WHERE
Временная таблица, сгенерированная в процессе VT1, фильтруется, и столбцы, удовлетворяющие предложению WHERE, вставляются в таблицу VT2:
- Разница с ON: если есть внешнее соединение, ON предназначено для фильтрации связанной таблицы, а основная таблица вернет все столбцы, если внешнего соединения нет, эффект тот же;
- Фильтрация основной таблицы должна находиться в WHERE;
- Для реляционных таблиц используйте ON для условного запроса, а затем соединения, и используйте WHERE для условного запроса после первого соединения;
3.GROUP BY
Это предложение сгруппирует таблицы, созданные в VT2, в соответствии со столбцами в GROUP BY для создания таблицы VT3:
- Для операторов последующей обработки, таких как SELECT, HAVING, используемые столбцы должны быть включены в GROUP BY, а для тех, которые не появляются, должны использоваться агрегатные функции;
4.HAVING
Отфильтруйте различные группы в таблице VT3 только для сгруппированных данных, и предложения, удовлетворяющие условию HAVING, будут добавлены в таблицу VT4.
5.SELECT
Это предложение обрабатывает элементы в предложении SELECT для создания таблицы VT5:
- Оцените выражение в предложении SELECT, чтобы сгенерировать VT5-J1;
- DISTINCT: найти повторяющиеся столбцы и удалить, создать временную таблицу памяти VT5-J2 и виртуальные таблицы VT5-J1, поскольку они отличаются, чтобы увеличить уникальный индекс столбцов DISTINCT, кроме как для дублирования данных;
6.ORDER BY
Из таблиц в VT5-J2 результаты сортируются в соответствии с условиями предложения ORDER BY, в результате чего получается таблица VT6, которая является единственным местом, где можно использовать псевдонимы в SELECT.
7.LIMIT
Выберите указанные данные строки, начиная с указанной позиции, из виртуальной таблицы VT6, полученной на предыдущем шаге.
Понятия, связанные с расширенными запросами
В этом разделе представлены часто используемые расширенные концепции запросов.
запрос на подключение
Данные нескольких таблиц объединяются в соответствии с заданным условием.В SQL запросы на соединение делятся на четыре категории: внутреннее соединение, внешнее соединение, естественное соединение и перекрестное соединение.Среди них редко используются естественные соединения и перекрестные соединения. , так что я не буду их слишком много представлять. .
1. внутреннее соединение внутреннее соединение
Возьмите каждую запись из левой таблицы и сопоставьте все записи в правой таблице соответственно. Сопоставление должно соответствовать условиям как в левой, так и в правой таблице. Результаты сопоставления будут сохранены, иначе они не будут сохранены.
2. Внешнее соединение левое/правое соединение
Существует два типа внешних соединений:
- левое соединение: левое внешнее соединение (левое соединение), с левой таблицей в качестве основной таблицы
- правое соединение: правое внешнее соединение (правое соединение), с правой таблицей в качестве основной таблицы
Возьмите таблицу как основную, вынесите в нее все записи, независимо от того, может ли она соответствовать условиям, основная таблица будет сохранена в конце, а затем связана с другой таблицей, если она не может соответствовать, поля других таблиц будет установлено значение NULL.
подзапрос
Запрос выполняется на вершине результата запроса, то есть оператор выбора содержит еще один оператор выбора.
По расположению подзапроса его можно разделить на:
- Из подзапроса: Подзапрос следует из;
- Подзапрос «Где»: подзапрос находится в состоянии «где»;
- существует подзапрос: подзапрос появляется в существует;
Вот несколько примеров:
Найдите всех сотрудников, название отдела которых имеет префикс «Xiaomi»:
SELECT name , sex , sal
FROM emp
WHERE no in (
SELECT no FROM dept
WHERE name LIKE '小米%'
);
Посмотреть зарплаты всех сотрудников, отсортированные по зарплате:
SELECT name , sal
FROM (
SELECT name , sal
FROM emp ORDER BY sal
);
совместный запрос
После множественных запросов и склеивания результатов поля не будут увеличиваться, а количество полей, получаемых каждым оператором select, должно быть строго согласовано.
Синтаксис следующий:
Select 语句1
Union [union选项]
Select语句2...
Опции профсоюза:
- Все: Сохранить все;
- Отдельный: дедупликация, опция по умолчанию;
Я написал еще, давайте добавим еще один, роман еще не закончен, чтобы продолжать. . .
Справочная статья:
Добро пожаловать, чтобы отсканировать QR-код ниже, обратите внимание на мою личную общедоступную учетную запись WeChat и просмотрите другие статьи ~