Текущая последняя версия 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?