SlideShare a Scribd company logo
1 of 40
ОПТИМИЗАЦИИ СКОРОСТИ
ВЫПОЛНЕНИЯ ЗАПРОСОВ В РСУБД
КОМУ И КОГДА НУЖНА ОПТИМИЗАЦИЯ?
КАК МОЖНО ОПТИМИЗИРОВАТЬ СКОРОСТЬ
ВЫПОЛНЕНИЯ
 На уровне запросов
 На уровне схемы
 На уровне системы
УРОВЕНЬ ЗАПРОСОВ
 Выполнение запроса
 Чтение планов выполнения
 Управления планами выполнения
 Типичные ошибки
ВЫПОЛНЕНИЕ ЗАПРОСА
ЧТЕНИЕ ПЛАНОВ ВЫПОЛНЕНИЯ (MYSQL)
 EXPLAIN - ориентировочный план выполнения
 SHOW STATUS - показывает непосредственно
что произошло после выполнения запроса, т.е.
количество записей, к которым MySQL
физически обратился (притом посредством
данной команды можно узнать сколько из них
было получено из памяти, а сколько
посредством обращения к диску
 PROFILING - возможность профайлинга
запросов
 PROCEDURE ANALYSE() – подсказки по
оптимизации
SHOW STATUS
 FLUSH STATUS
 …
 SHOW STATUS LIKE 'Key_read%';
 Key_read_requests — Количество запросов на
чтение индексных блоков из кеша.
 Key_reads — Количество физического чтения
индексных блоков с диска. Если число
Key_reads большое, тогда, вероятно, ваше
key_buffer_size достаточно мало и требует
увеличения. Отношение непопаданий в кэш
можно посчитать как
Key_reads/Key_read_requests.
PROFILING
 set profiling=1;
 …
 show profiles;
 select sum(duration) from
information_schema.profiling where
query_id=1;
 show profile for query 1;
ЧТЕНИЕ ПЛАНОВ MYSQL
 EXPLAIN
 Id - Идентификатор (ID) таблицы в запросе. EXPLAIN создает по
одной записи для каждой таблицы в запросе.
 Select_type - Возможные значения:
SIMPLE, PRIMARY, UNION, DEPENDENT UNION, SUBSELECT, и
DERIVED.
 Table - Имя таблицы, из которой MySQL читает данные
 Type - Тип объединения, которое использует MySQL. Возможные
значения: eq_ref, ref, range, index, или all.
 Possible_keys – Список индексов (или NULL, если индексов
нет), которые MySQL может использовать для выборки рядов в
таблице.
 Key - Название индекса, который использует MySQL (после
проверки всех возможных индексов).
 Key_len - Размер ключа в байтах.
 Ref - Колонки или значения, которые используются для
сравнения с ключем.
 Rows - Количество рядов, которые MySQL необходимо
проверить, для обработки запроса.
 Extra - Дополнительная информация о запросе.
ЧТЕНИЕ ПЛАНОВ ВЫПОЛНЕНИЯ
(POSTGRESQL)
 EXPLAIN – предположительный план
выполнения
 EXPLAIN ANALYZE – реальный план
выполнения, выводиться после выполнения
запроса
 ANALYZE – собрать статистику
 VACUUM - дефрагментация
 REINDEX
EXPLAIN (POSTGRESQL)
 explain select attname
from pg_attribute, pg_class
where pg_attribute.attrelid = pg_class.oid
and pg_class.relname = ’pg_proc’
order by pg_attribute.attnum;
Sort (cost=27.66..27.68 rows=7 width=66)
Sort Key: pg_attribute.attnum
-> Nested Loop (cost=0.00..27.56 rows=7 width=66)
-> Index Scan using pg_class_relname_nsp_index on
pg_class (cost=0.00..8.27 rows=1 width=4)
Index Cond: (relname = ’pg_proc’::name)
-> Index Scan using pg_attribute_relid_attnum_index on
pg_attribute (cost=0.00..19.21 rows=7 width=70)
Index Cond: (pg_attribute.attrelid =
pg_class.oid)
УПРАВЛЕНИЯ ПЛАНАМИ ВЫПОЛНЕНИЯ
 Использование правильного индекса
 Запретить использование неподходящего
индекса
 Подсказки для оптимизатора
 Запрет Соединения в неправильном порядке
 Подсказки
ИСПОЛЬЗОВАНИЕ ПРАВИЛЬНОГО ИНДЕКСА
Таблица.ВедущийСтолбецИндекса = Выражение
 Селективное условие по ведущему столбцу
индекса. Условие должно быть таким чтобы БД
могла выделить достаточно узкий диапазон.
 Преобразование типов (условие в запросе и
поле должны использовать один тип данных)
 Условия соединены оператором OR
 В условии присутствуют функции от ведущего
столбца индекса.
ЗАПРЕТИТЬ ИСПОЛЬЗОВАНИЕ
НЕПОДХОДЯЩЕГО ИНДЕКСА
 Создать простейшее выражение при
упоминании индексируемого столбца:
O.Regino_ID + 0 = 137
 Подсказки:
 table_name [[AS] alias] [index_hint]
 USE INDEX (index_list)
 GNORE INDEX (index_list)
 FORCE INDEX (index_list)
ЗАПРЕТ СОЕДИНЕНИЯ В НЕПРАВИЛЬНОМ
ПОРЯДКЕ
 Запрещение использования индекса
 Использование внешних соединений
SELECT … FROM employees E
LEFT OUTER JOIN location L ON E.location_id = L.id
 Отсутствие избыточных условий соединения
SELECT …
FROM employees E, locations L, addresses A
WERE E.location_id = L.id
AND E.location_id = A.id
AND A.zip_code = 95628
ЗАПРЕТ СОЕДИНЕНИЯ В НЕПРАВИЛЬНОМ
ПОРЯДКЕ
 Зависимости соединений.
… AND T1.Key2 = T2.Key2
AND T1.Key3 + 0*T2.Key2 = T3.Key3 …
 STRAIGHT_JOIN – тоже что и JOIN, только
левая таблица всегда читается до правой.
С ЧЕГО НАЧАТЬ?
 --log-slow-queries
 логирование медленных запросов,
 минимальное значение параметра long_query_time 1,
 значение по умолчанию 10
 --log-queries-not-using-indexes
 логирование запросов, которые не используют индексы
ОШИБКИ (DESIGN )
 Сначала нормализуем, потом денормализуем
где необходимо.
 Старайтесь всегда создать поле ID.
 Индексируйте поля, по которым ищите.
 Индексируйте поля для объединения и
используйте для них одинаковые типы столбцов.
 Не индексируйте все что попало!
 Не включайте в индекс большие колонки.
 Не дублируйте индексы
 Используйте NOT NULL, если это возможно
ОШИБКИ (SQL)
 Используйте Prepared Statements
 Не используйте DISTINCT если вы используете
GROUP BY
 LIMIT m,n не так быстр как кажется
 По возможности заменяйте OR на UNION
 GROUP BY … ORDER BY NULL
 UNION и UNION ALL две разные операции и
чаще всего вам нужно второе
 Минимизируйте коррелируемымые подзапросы
ОШИБКИ
 По возможности не используйте SELECT *
 SQL_NO_CACHE когда вы делаете SELECT для
часто обновляемого набора данных
 Не используйте ORDER BY RAND()
 LIMIT 1, когда нужна единственная строка
 SELECT * FROM user WHERE state =
'Alabama' LIMIT 1
 Используйте ENUM вместо VARCHAR
КОНКРЕТНЫЕ ЗАПРОСЫ
 SELECT max(...)/min(...) FROM <big table>
 SELECT field FROM foo ORDER BY field DESC LIMIT
1;
 Pagination
 WHERE … AND NODE_ID > id_from_previous_page
ORDER BY NODE_ID LIMIT 25
 SELECT count(*) FROM <big table>
 лучше так и использовать
НА УРОВНЕ СХЕМЫ
 НормализацияДенормализация
 БлокировкиТранзакции
 Типы таблиц
 Views
 Temporary Tables
 Indexes
 Тригеры
ТИПЫ ТАБЛИЦ
 ISAM - Оригинальный обработчик таблиц.
 MyISAM - Новый обработчик, обеспечивающий
переносимость таблиц в бинарном
виде, который заменяет ISAM
 BDB – (Berkley DB) Таблицы с поддержкой
транзакций и блокировкой страниц.
 InnoDB - Таблицы с поддержкой транзакций и
блокировкой строк
 MERGE - Набор таблиц MyISAM, используемый
как одна таблица.
 HEAP - Данные для этой таблицы хранятся
только в памяти
VIEWS
 CREATE [ALGORITHM = {UNDEFINED | MERGE |
TEMPTABLE}] VIEW
 MERGE – при обращении к представлению
добавляет в использующийся оператор
соответствующие части из определения
представления и выполняет получившийся
оператор
 TEMPTABLE - заносит содержимое
представления во временную таблицу, над
которой затем выполняется оператор
обращенный к представлению
INDEXES
 B-/B+ tree
 R-/R+ tree
 Hash
 Expression
 Partial
 Reverse
 Bitmap
 GiST
 GIN
 Кластерные - строки таблицы
физически хранятся в заданном
порядке и непосредственно
связаны с элементами индекса,
благодаря чему значительно
ускоряется доступ к данным при
использовании запросов,
использующих данный индекс
 Некластерные
B-ДЕРЕВЬЯ
Логическое представление -
сбалансированное сильно
ветвистое дерево во внешней
памяти.
Физической организации B-
дерево представляется как
мультисписочная структура
страниц внешней памяти.
R-ДЕРЕВО
Подобно B-дереву, но
используется для организации
доступа к пространственным
данным, то есть для
индексации многомерной
информации, такой, например
, как географические данные
HASH
 They are used only for equality comparisons that
use the = or <=> operators (but are very fast)
 The optimizer cannot use a hash index to speed up
ORDER BY operations
 This may affect some queries if you change a
MyISAM table to a hash-indexed MEMORY table.
 Only whole keys can be used to search for a row.
EXPRESSION & PARTIAL & REVERSE
 Expression
 SELECT * FROM people WHERE
(first_name || ' ' || last_name) = 'John Smith';
 CREATE INDEX people_names ON people
((first_name || ' ' || last_name));
 Partial
 SELECT * FROM scheta
WHERE NOT uplocheno AND ...;
 CREATE INDEX scheta_neuplocheno ON scheta (id)
WHERE NOT uplocheno;
 Reverse
 обращает поле переменной — первый символ
считается последним
 24538 -> 83542
BITMAP
 для данных с малой мощностью множества
(cardinality)
GIST (GENERALIZED SEARCH TREE)
 представляет собой систему, объединяющую
большой набор различных алгоритмов сортировки и
поиска, включая B-деревья, B+-деревья, R-
деревья, деревья частичных сумм, ранжированные
B+-деревья, и другие. Она также обеспечивает
интерфейс, обеспечивающий как создание
пользовательских типов данных, так и расширенные
методы запросов, позволяющие выполнять поиск по
ним. Т.е. GiST дает возможность определить, что вы
храните, как вы это храните, и каким образом вы
будете выполнять поиск. Эти возможности
существенно превышают средства, даваемые
стандартными алгоритмами типа B-дерева или R-
дерева.
GIST (GENERALIZED SEARCH TREE)
 Стандарные методы навигации по дереву
 Обновление дерева
 Конкурентность и восстановление после сбоя
 GiST позволяет реализовать новый АМ эксперту
в области данных
 Поддерживает расширяемый набор запросов ( в
отличие от Btree)
 Новые типы данных обладают
производительностью (индексный
доступ, конкурентность) и надежностью
(протокол логирования), как и встроенные типы
GIN (GENERALIZED INVERTED INDEX)
 Поддерживает разные типы данных
 Очень быстрый поиск по ключам — Btree
 Поддержка partial match
 Многоатрибутный индекс
 Хорошая масштабируемость (кол-во
ключей, кол-во документов)
 Быстрое создание индекса
 Медленное обновление индекса :(
 Надежность и хороший параллелизм
ПРИЛОЖЕНИЯ (GIST, GIN)
 Целочисленные массивы (GiST, GIN)
 Полнотекстовый поиск (GiST, GIN)
 Данные с древовидной структурой (GiST)
 Поиск похожих слов (GiST, GIN)
 Rtree (GiST)
 PostGIS (postgis.org) (GiST) — spatial index
 BLASTgres (GiST) — биоинформатика
 Многомерный куб (GiST)
 ........
СРАВНЕНИЕ
MySQL Oracle PostgreSQL HSQLDB SQLite
B-/B+ tree
R-/R+ tree
Hash
Expression
Partial
Reverse
Bitmap
GiST
GIN
RDBMS
ТРИГЕРЫ
 CREATE TRIGGER trigger_name trigger_time
trigger_event ON tbl_name FOR EACH ROW
trigger_stmt
 trigger_time
 BEFORE
 AFTER
 trigger_event
 Insert (insert, data load, replace)
 Update (update)
 Delete (delete, replace)
ДРУГИЕ
 НормализацияДенормализация
 Большое количество соединений таблиц
 Расчетные значения
 Длинные поля
 Temporary table
 CREATE [TEMPORARY] TABLE …
 БлокировкиТранзакции
НА УРОВНЕ СИСТЕМЫ
 Наиболее важно настроить потребление
памяти
Нельзя забывать, что РСУБД такое же
приложение как и все остальные на сервере. И
чаще всего оно использует файловую систему
операционной системы, у которой есть свои
КЭШи.
 OPTIMIZE TABLE имя_таблицы;
Почистить "дырки" (дефрагментация),
обновить статистику и отсортировать индексы.
 ANALYZE TABLE имя_таблицы;
Апдейт статистики оптимизатора.
ЛИТЕРАТУРА
 SQL Tuning. Dan Tow
 High Performance MySQL. Baron Schwartz, Peter
Zaitsev, Vadim Tkachenko, Jeremy D.
Zawodny, Arjen Lentz,and Derek J. Balling
 www.mysql.ru
 www.phpclub.ru
 http://dev.mysql.com/doc/refman
 http://www.mysqlperformanceblog.com
 http://highload.ru

More Related Content

What's hot

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
sphinx Hlpp2008
sphinx Hlpp2008sphinx Hlpp2008
sphinx Hlpp2008Ontico
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...Ontico
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipesAlexey Ermakov
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Pavel Egorov
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9Technopark
 
"Секционирование без границ" Ильдар Мусин (Postgres Professional)
"Секционирование без границ" Ильдар Мусин (Postgres Professional)"Секционирование без границ" Ильдар Мусин (Postgres Professional)
"Секционирование без границ" Ильдар Мусин (Postgres Professional)AvitoTech
 
Where is the space, Postgres?
Where is the space, Postgres?Where is the space, Postgres?
Where is the space, Postgres?Alexey Ermakov
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Ontico
 
0044
00440044
0044JIuc
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8Technopark
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Ontico
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...pgdayrussia
 
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)Alexey Kovyazin
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINAlexey Ermakov
 
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...Michael Oreshin
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf Conference
 

What's hot (20)

СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
sphinx Hlpp2008
sphinx Hlpp2008sphinx Hlpp2008
sphinx Hlpp2008
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...Долгожданный релиз pg_pathman 1.0 / Александр Коротков,  Дмитрий Иванов (Post...
Долгожданный релиз pg_pathman 1.0 / Александр Коротков, Дмитрий Иванов (Post...
 
PostgreSQL performance recipes
PostgreSQL performance recipesPostgreSQL performance recipes
PostgreSQL performance recipes
 
Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1Мастер класс по алгоритмам. Часть 1
Мастер класс по алгоритмам. Часть 1
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9
 
"Секционирование без границ" Ильдар Мусин (Postgres Professional)
"Секционирование без границ" Ильдар Мусин (Postgres Professional)"Секционирование без границ" Ильдар Мусин (Postgres Professional)
"Секционирование без границ" Ильдар Мусин (Postgres Professional)
 
Where is the space, Postgres?
Where is the space, Postgres?Where is the space, Postgres?
Where is the space, Postgres?
 
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
Олег Бартунов, Федор Сигаев, Александр Коротков (PostgreSQL)
 
0044
00440044
0044
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
 
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
Расширяемость PostgreSQL для хакеров и архитекторов / Олег Бартунов, Александ...
 
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
PG Day'14 Russia, PostgreSQL как платформа для разработки приложений, часть 2...
 
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)
Firebird 2.5 - вектор дальнейшего развития, Dmitry Yemanov, (in Russian)
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
 
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...
СУБД PostgreSQL ИЗ ДИСТРИБУТИВА ОПЕРАЦИОННОЙ СИСТЕМЫ СПЕЦИАЛЬНОГО НАЗНАЧЕНИЯ ...
 
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
ZFConf 2011: Толстая модель: История разработки собственного ORM (Михаил Шамин)
 

Viewers also liked

Gestió Del Talent 22 4 09
Gestió Del Talent 22 4 09Gestió Del Talent 22 4 09
Gestió Del Talent 22 4 09guestcb4a77
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программированияAlex.Kolonitsky
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerLuminary Labs
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsLinkedIn
 

Viewers also liked (9)

gomaa
gomaagomaa
gomaa
 
Link Samples01
Link Samples01Link Samples01
Link Samples01
 
Gestió Del Talent 22 4 09
Gestió Del Talent 22 4 09Gestió Del Talent 22 4 09
Gestió Del Talent 22 4 09
 
Demo Straatroof Op Tijden
Demo Straatroof Op TijdenDemo Straatroof Op Tijden
Demo Straatroof Op Tijden
 
gomaa
gomaagomaa
gomaa
 
gomaa
gomaagomaa
gomaa
 
Характерные черты функциональных языков программирования
Характерные черты функциональных языков программированияХарактерные черты функциональных языков программирования
Характерные черты функциональных языков программирования
 
Hype vs. Reality: The AI Explainer
Hype vs. Reality: The AI ExplainerHype vs. Reality: The AI Explainer
Hype vs. Reality: The AI Explainer
 
Study: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving CarsStudy: The Future of VR, AR and Self-Driving Cars
Study: The Future of VR, AR and Self-Driving Cars
 

Similar to Оптимизации скорости выполнения запросов

MySQL для высоконагруженных проектов
MySQL для высоконагруженных проектовMySQL для высоконагруженных проектов
MySQL для высоконагруженных проектовSoftline
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
 
Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)Andrew Avdeev
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLNikolay Pisarev
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsTroubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsSveta Smirnova
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
физическая структура хранения артемов Ready
физическая структура хранения артемов Readyфизическая структура хранения артемов Ready
физическая структура хранения артемов Readyrit2010
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Badoo Development
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Alexey Kovyazin
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеVolha Banadyseva
 
СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7Technopark
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данныхLevon Avakyan
 

Similar to Оптимизации скорости выполнения запросов (20)

MySQL для высоконагруженных проектов
MySQL для высоконагруженных проектовMySQL для высоконагруженных проектов
MySQL для высоконагруженных проектов
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)Масштабирование баз данных. (Database Scalability)
Масштабирование баз данных. (Database Scalability)
 
My sql 0
My sql 0My sql 0
My sql 0
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
Cassandra design patterns
Cassandra design patternsCassandra design patterns
Cassandra design patterns
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsTroubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addons
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
физическая структура хранения артемов Ready
физическая структура хранения артемов Readyфизическая структура хранения артемов Ready
физическая структура хранения артемов Ready
 
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проекте
 
СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7СУБД осень 2012 лекция 7
СУБД осень 2012 лекция 7
 
Реляционные базы данных
Реляционные базы данныхРеляционные базы данных
Реляционные базы данных
 

Оптимизации скорости выполнения запросов

  • 2. КОМУ И КОГДА НУЖНА ОПТИМИЗАЦИЯ?
  • 3. КАК МОЖНО ОПТИМИЗИРОВАТЬ СКОРОСТЬ ВЫПОЛНЕНИЯ  На уровне запросов  На уровне схемы  На уровне системы
  • 4. УРОВЕНЬ ЗАПРОСОВ  Выполнение запроса  Чтение планов выполнения  Управления планами выполнения  Типичные ошибки
  • 6. ЧТЕНИЕ ПЛАНОВ ВЫПОЛНЕНИЯ (MYSQL)  EXPLAIN - ориентировочный план выполнения  SHOW STATUS - показывает непосредственно что произошло после выполнения запроса, т.е. количество записей, к которым MySQL физически обратился (притом посредством данной команды можно узнать сколько из них было получено из памяти, а сколько посредством обращения к диску  PROFILING - возможность профайлинга запросов  PROCEDURE ANALYSE() – подсказки по оптимизации
  • 7. SHOW STATUS  FLUSH STATUS  …  SHOW STATUS LIKE 'Key_read%';  Key_read_requests — Количество запросов на чтение индексных блоков из кеша.  Key_reads — Количество физического чтения индексных блоков с диска. Если число Key_reads большое, тогда, вероятно, ваше key_buffer_size достаточно мало и требует увеличения. Отношение непопаданий в кэш можно посчитать как Key_reads/Key_read_requests.
  • 8. PROFILING  set profiling=1;  …  show profiles;  select sum(duration) from information_schema.profiling where query_id=1;  show profile for query 1;
  • 9. ЧТЕНИЕ ПЛАНОВ MYSQL  EXPLAIN  Id - Идентификатор (ID) таблицы в запросе. EXPLAIN создает по одной записи для каждой таблицы в запросе.  Select_type - Возможные значения: SIMPLE, PRIMARY, UNION, DEPENDENT UNION, SUBSELECT, и DERIVED.  Table - Имя таблицы, из которой MySQL читает данные  Type - Тип объединения, которое использует MySQL. Возможные значения: eq_ref, ref, range, index, или all.  Possible_keys – Список индексов (или NULL, если индексов нет), которые MySQL может использовать для выборки рядов в таблице.  Key - Название индекса, который использует MySQL (после проверки всех возможных индексов).  Key_len - Размер ключа в байтах.  Ref - Колонки или значения, которые используются для сравнения с ключем.  Rows - Количество рядов, которые MySQL необходимо проверить, для обработки запроса.  Extra - Дополнительная информация о запросе.
  • 10. ЧТЕНИЕ ПЛАНОВ ВЫПОЛНЕНИЯ (POSTGRESQL)  EXPLAIN – предположительный план выполнения  EXPLAIN ANALYZE – реальный план выполнения, выводиться после выполнения запроса  ANALYZE – собрать статистику  VACUUM - дефрагментация  REINDEX
  • 11. EXPLAIN (POSTGRESQL)  explain select attname from pg_attribute, pg_class where pg_attribute.attrelid = pg_class.oid and pg_class.relname = ’pg_proc’ order by pg_attribute.attnum; Sort (cost=27.66..27.68 rows=7 width=66) Sort Key: pg_attribute.attnum -> Nested Loop (cost=0.00..27.56 rows=7 width=66) -> Index Scan using pg_class_relname_nsp_index on pg_class (cost=0.00..8.27 rows=1 width=4) Index Cond: (relname = ’pg_proc’::name) -> Index Scan using pg_attribute_relid_attnum_index on pg_attribute (cost=0.00..19.21 rows=7 width=70) Index Cond: (pg_attribute.attrelid = pg_class.oid)
  • 12. УПРАВЛЕНИЯ ПЛАНАМИ ВЫПОЛНЕНИЯ  Использование правильного индекса  Запретить использование неподходящего индекса  Подсказки для оптимизатора  Запрет Соединения в неправильном порядке  Подсказки
  • 13. ИСПОЛЬЗОВАНИЕ ПРАВИЛЬНОГО ИНДЕКСА Таблица.ВедущийСтолбецИндекса = Выражение  Селективное условие по ведущему столбцу индекса. Условие должно быть таким чтобы БД могла выделить достаточно узкий диапазон.  Преобразование типов (условие в запросе и поле должны использовать один тип данных)  Условия соединены оператором OR  В условии присутствуют функции от ведущего столбца индекса.
  • 14. ЗАПРЕТИТЬ ИСПОЛЬЗОВАНИЕ НЕПОДХОДЯЩЕГО ИНДЕКСА  Создать простейшее выражение при упоминании индексируемого столбца: O.Regino_ID + 0 = 137  Подсказки:  table_name [[AS] alias] [index_hint]  USE INDEX (index_list)  GNORE INDEX (index_list)  FORCE INDEX (index_list)
  • 15. ЗАПРЕТ СОЕДИНЕНИЯ В НЕПРАВИЛЬНОМ ПОРЯДКЕ  Запрещение использования индекса  Использование внешних соединений SELECT … FROM employees E LEFT OUTER JOIN location L ON E.location_id = L.id  Отсутствие избыточных условий соединения SELECT … FROM employees E, locations L, addresses A WERE E.location_id = L.id AND E.location_id = A.id AND A.zip_code = 95628
  • 16. ЗАПРЕТ СОЕДИНЕНИЯ В НЕПРАВИЛЬНОМ ПОРЯДКЕ  Зависимости соединений. … AND T1.Key2 = T2.Key2 AND T1.Key3 + 0*T2.Key2 = T3.Key3 …  STRAIGHT_JOIN – тоже что и JOIN, только левая таблица всегда читается до правой.
  • 17. С ЧЕГО НАЧАТЬ?  --log-slow-queries  логирование медленных запросов,  минимальное значение параметра long_query_time 1,  значение по умолчанию 10  --log-queries-not-using-indexes  логирование запросов, которые не используют индексы
  • 18. ОШИБКИ (DESIGN )  Сначала нормализуем, потом денормализуем где необходимо.  Старайтесь всегда создать поле ID.  Индексируйте поля, по которым ищите.  Индексируйте поля для объединения и используйте для них одинаковые типы столбцов.  Не индексируйте все что попало!  Не включайте в индекс большие колонки.  Не дублируйте индексы  Используйте NOT NULL, если это возможно
  • 19. ОШИБКИ (SQL)  Используйте Prepared Statements  Не используйте DISTINCT если вы используете GROUP BY  LIMIT m,n не так быстр как кажется  По возможности заменяйте OR на UNION  GROUP BY … ORDER BY NULL  UNION и UNION ALL две разные операции и чаще всего вам нужно второе  Минимизируйте коррелируемымые подзапросы
  • 20. ОШИБКИ  По возможности не используйте SELECT *  SQL_NO_CACHE когда вы делаете SELECT для часто обновляемого набора данных  Не используйте ORDER BY RAND()  LIMIT 1, когда нужна единственная строка  SELECT * FROM user WHERE state = 'Alabama' LIMIT 1  Используйте ENUM вместо VARCHAR
  • 21. КОНКРЕТНЫЕ ЗАПРОСЫ  SELECT max(...)/min(...) FROM <big table>  SELECT field FROM foo ORDER BY field DESC LIMIT 1;  Pagination  WHERE … AND NODE_ID > id_from_previous_page ORDER BY NODE_ID LIMIT 25  SELECT count(*) FROM <big table>  лучше так и использовать
  • 22. НА УРОВНЕ СХЕМЫ  НормализацияДенормализация  БлокировкиТранзакции  Типы таблиц  Views  Temporary Tables  Indexes  Тригеры
  • 23. ТИПЫ ТАБЛИЦ  ISAM - Оригинальный обработчик таблиц.  MyISAM - Новый обработчик, обеспечивающий переносимость таблиц в бинарном виде, который заменяет ISAM  BDB – (Berkley DB) Таблицы с поддержкой транзакций и блокировкой страниц.  InnoDB - Таблицы с поддержкой транзакций и блокировкой строк  MERGE - Набор таблиц MyISAM, используемый как одна таблица.  HEAP - Данные для этой таблицы хранятся только в памяти
  • 24. VIEWS  CREATE [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW  MERGE – при обращении к представлению добавляет в использующийся оператор соответствующие части из определения представления и выполняет получившийся оператор  TEMPTABLE - заносит содержимое представления во временную таблицу, над которой затем выполняется оператор обращенный к представлению
  • 25. INDEXES  B-/B+ tree  R-/R+ tree  Hash  Expression  Partial  Reverse  Bitmap  GiST  GIN  Кластерные - строки таблицы физически хранятся в заданном порядке и непосредственно связаны с элементами индекса, благодаря чему значительно ускоряется доступ к данным при использовании запросов, использующих данный индекс  Некластерные
  • 26. B-ДЕРЕВЬЯ Логическое представление - сбалансированное сильно ветвистое дерево во внешней памяти. Физической организации B- дерево представляется как мультисписочная структура страниц внешней памяти.
  • 27. R-ДЕРЕВО Подобно B-дереву, но используется для организации доступа к пространственным данным, то есть для индексации многомерной информации, такой, например , как географические данные
  • 28. HASH  They are used only for equality comparisons that use the = or <=> operators (but are very fast)  The optimizer cannot use a hash index to speed up ORDER BY operations  This may affect some queries if you change a MyISAM table to a hash-indexed MEMORY table.  Only whole keys can be used to search for a row.
  • 29. EXPRESSION & PARTIAL & REVERSE  Expression  SELECT * FROM people WHERE (first_name || ' ' || last_name) = 'John Smith';  CREATE INDEX people_names ON people ((first_name || ' ' || last_name));  Partial  SELECT * FROM scheta WHERE NOT uplocheno AND ...;  CREATE INDEX scheta_neuplocheno ON scheta (id) WHERE NOT uplocheno;  Reverse  обращает поле переменной — первый символ считается последним  24538 -> 83542
  • 30. BITMAP  для данных с малой мощностью множества (cardinality)
  • 31. GIST (GENERALIZED SEARCH TREE)  представляет собой систему, объединяющую большой набор различных алгоритмов сортировки и поиска, включая B-деревья, B+-деревья, R- деревья, деревья частичных сумм, ранжированные B+-деревья, и другие. Она также обеспечивает интерфейс, обеспечивающий как создание пользовательских типов данных, так и расширенные методы запросов, позволяющие выполнять поиск по ним. Т.е. GiST дает возможность определить, что вы храните, как вы это храните, и каким образом вы будете выполнять поиск. Эти возможности существенно превышают средства, даваемые стандартными алгоритмами типа B-дерева или R- дерева.
  • 32. GIST (GENERALIZED SEARCH TREE)  Стандарные методы навигации по дереву  Обновление дерева  Конкурентность и восстановление после сбоя  GiST позволяет реализовать новый АМ эксперту в области данных  Поддерживает расширяемый набор запросов ( в отличие от Btree)  Новые типы данных обладают производительностью (индексный доступ, конкурентность) и надежностью (протокол логирования), как и встроенные типы
  • 33. GIN (GENERALIZED INVERTED INDEX)  Поддерживает разные типы данных  Очень быстрый поиск по ключам — Btree  Поддержка partial match  Многоатрибутный индекс  Хорошая масштабируемость (кол-во ключей, кол-во документов)  Быстрое создание индекса  Медленное обновление индекса :(  Надежность и хороший параллелизм
  • 34. ПРИЛОЖЕНИЯ (GIST, GIN)  Целочисленные массивы (GiST, GIN)  Полнотекстовый поиск (GiST, GIN)  Данные с древовидной структурой (GiST)  Поиск похожих слов (GiST, GIN)  Rtree (GiST)  PostGIS (postgis.org) (GiST) — spatial index  BLASTgres (GiST) — биоинформатика  Многомерный куб (GiST)  ........
  • 35. СРАВНЕНИЕ MySQL Oracle PostgreSQL HSQLDB SQLite B-/B+ tree R-/R+ tree Hash Expression Partial Reverse Bitmap GiST GIN
  • 36. RDBMS
  • 37. ТРИГЕРЫ  CREATE TRIGGER trigger_name trigger_time trigger_event ON tbl_name FOR EACH ROW trigger_stmt  trigger_time  BEFORE  AFTER  trigger_event  Insert (insert, data load, replace)  Update (update)  Delete (delete, replace)
  • 38. ДРУГИЕ  НормализацияДенормализация  Большое количество соединений таблиц  Расчетные значения  Длинные поля  Temporary table  CREATE [TEMPORARY] TABLE …  БлокировкиТранзакции
  • 39. НА УРОВНЕ СИСТЕМЫ  Наиболее важно настроить потребление памяти Нельзя забывать, что РСУБД такое же приложение как и все остальные на сервере. И чаще всего оно использует файловую систему операционной системы, у которой есть свои КЭШи.  OPTIMIZE TABLE имя_таблицы; Почистить "дырки" (дефрагментация), обновить статистику и отсортировать индексы.  ANALYZE TABLE имя_таблицы; Апдейт статистики оптимизатора.
  • 40. ЛИТЕРАТУРА  SQL Tuning. Dan Tow  High Performance MySQL. Baron Schwartz, Peter Zaitsev, Vadim Tkachenko, Jeremy D. Zawodny, Arjen Lentz,and Derek J. Balling  www.mysql.ru  www.phpclub.ru  http://dev.mysql.com/doc/refman  http://www.mysqlperformanceblog.com  http://highload.ru