Новые возможности реляционных баз данных в MySQL 8.0

база данных MySQL

Текущая последняя версия MySQL 8.0 — 8.0.4 rc, и ожидается, что официальная версия выйдет в ближайшее время. В этой статье описываются некоторые основные новые функции реляционных баз данных версии 8.0.

Возможно, вы уже знаете, что MySQL предоставляет функцию хранения NoSQL с версии 5.7, и эта часть функции также была улучшена в версии 8.0, но так как это редко используется на практике, я никогда не использовал ее, поэтому эта статья не будет познакомьтесь с этим материалом, но сосредоточьтесь на его аспекте реляционной базы данных.

1. Скрытый индекс

Функция скрытия индексов очень полезна для отладки производительности. В версии 8.0 индексы можно «скрывать» и «показывать». Когда индекс скрыт, он не используется оптимизатором запросов.

То есть мы можем скрыть индекс и наблюдать за влиянием на базу данных. Если производительность БД снизилась, значит, индекс полезен, поэтому его можно «восстановить и отобразить», если производительность БД не изменилась, значит, индекс избыточен и его можно удалить .

Синтаксис для скрытия индекса:

ALTER TABLE t ALTER INDEX i INVISIBLE;

Синтаксис для восстановления отображения этого индекса:

ALTER TABLE t ALTER INDEX i VISIBLE;

Когда индекс скрыт, мы можем начать сshow indexКак видно из вывода команды, индексVisibleСтоимость свойстваNO.

Примечание. Когда индекс скрыт, его содержимое по-прежнему обновляется в режиме реального времени, как и обычный индекс. Сама эта функция используется исключительно для оптимизированной отладки. Если вы скрываете индекс на долгое время, лучше его удалить, ведь наличие индекса повлияет на производительность вставки, обновления и удаления.

2. Установите постоянство

Настройки MySQL могут быть установлены во время выполнения черезSET GLOBALкоманду изменить, но это изменение вступит в силу только временно, и база данных будет считана из файла конфигурации при следующем запуске.

Добавлен MySQL 8SET PERSISTкоманда, например:

SET PERSIST max_connections = 500;

MySQL сохранит конфигурацию команды в каталог данныхmysqld-auto.cnfфайл, файл будет прочитан при следующем запуске, и файл конфигурации по умолчанию будет перезаписан содержащейся в нем конфигурацией.

3. Кодировка UTF-8

Начиная с MySQL 8 кодировка базы данных по умолчанию будет изменена наutf8mb4, эта кодировка содержит все символы эмодзи. На протяжении многих лет мы использовали MySQL, чтобы быть осторожными в кодировании, опасаясь забыть изменить латиницу по умолчанию и вызвать искажение символов. Не беспокойтесь с этого момента.

4. Общие табличные выражения

В сложных запросах используются встроенные таблицы, например:

SELECT t1.*, t2.* FROM 
  (SELECT col1 FROM table1) t1,
  (SELECT col2 FROM table2) t2;

И с CTE мы можем написать:

WITH
  t1 AS (SELECT col1 FROM table1),
  t2 AS (SELECT col2 FROM table2)
SELECT t1.*, t2.* 
FROM t1, t2;

Таким образом, кажется, что уровни и области более четкие, и становится яснее знать, какую часть изменить при изменении.

Для более подробного ознакомления с CTE см.официальная документация.

5. Оконные функции

Одной из наиболее часто жалуемых особенностей MySQL является отсутствие функции rank().Когда вам нужно ранжировать в запросе, вы должны написать переменную @ вручную. Но начиная с версии 8.0 в MySQL была добавлена ​​концепция оконной функции, которую можно использовать для реализации нескольких новых методов запросов.

Оконная функция немного похожа наSUM(),COUNT()Агрегатные функции аналогичны этому, но вместо того, чтобы объединять несколько строк результатов запроса в одну строку, он помещает результаты обратно в несколько строк. То есть оконная функция не требуетсяGROUP BYиз.

Предположим, у нас есть таблица «Количество учеников в классе»:

mysql> select * from classes;
+--------+-----------+
| name   | stu_count |
+--------+-----------+
| class1 |        41 |
| class2 |        43 |
| class3 |        57 |
| class4 |        57 |
| class5 |        37 |
+--------+-----------+
5 rows in set (0.00 sec)

Если я хочу ранжировать размер класса от наименьшего к наибольшему, я могу использовать оконную функцию следующим образом:

mysql> select *, rank() over w as `rank` from classes
    -> window w as (order by stu_count);
+--------+-----------+------+
| name   | stu_count | rank |
+--------+-----------+------+
| class5 |        37 |    1 |
| class1 |        41 |    2 |
| class2 |        43 |    3 |
| class3 |        57 |    4 |
| class4 |        57 |    4 |
+--------+-----------+------+
5 rows in set (0.00 sec)

Здесь мы создаем окно с именем w, указываем его для сортировки поля stu_count, а затем выполняем метод rank() для w в предложении select, выводя результат в виде поля rank.

Собственно, создание окна необязательно. Например, если я хочу добавить общее количество студентов в каждой строке, я могу сделать это:

mysql> select *, sum(stu_count) over() as total_count
    -> from classes;
+--------+-----------+-------------+
| name   | stu_count | total_count |
+--------+-----------+-------------+
| class1 |        41 |         235 |
| class2 |        43 |         235 |
| class3 |        57 |         235 |
| class4 |        57 |         235 |
| class5 |        37 |         235 |
+--------+-----------+-------------+
5 rows in set (0.00 sec)

Какая польза от этого? Таким образом, мы можем узнать долю учеников в каждом классе за один раз:

mysql> select *,
    -> (stu_count)/(sum(stu_count) over()) as rate
    -> from classes;
+--------+-----------+--------+
| name   | stu_count | rate   |
+--------+-----------+--------+
| class1 |        41 | 0.1745 |
| class2 |        43 | 0.1830 |
| class3 |        57 | 0.2426 |
| class4 |        57 | 0.2426 |
| class5 |        37 | 0.1574 |
+--------+-----------+--------+
5 rows in set (0.00 sec)

Раньше это можно было сделать, только написав длинный абзац непонятных предложений! Подробнее об оконных функцияхэто здесь.


Что ж, после прочтения предисловия у вас есть какие-то дополнительные ожидания от MySQL 8.0?