SlideShare une entreprise Scribd logo
1  sur  44
СУБД
Лекция 6
Павел Щербинин
Профилирование
• К каким данным MySQL обращается чаще всего
• Какие типы запросов MySQL выполняет чаще всего
• В каких состояниях преимущественно находятся потоки
(threads) MySQL
• Какие подсистемы MySQL чаще всего использует для
выполнения запросов
• Какие виды обращения к данным встречаются наиболее часто
• Сколько различных видов действий, например просмотра
индексов, выполняет MySQL
Протоколирование запросов
Общий журнал
log = <имя_файла>
Журнал медленных запросов
log-slow-queries = <имя_файла>
long_query_time = 2
log-queries-not-using-indexes
log-slow-admin-statements
# Time: 121018 9:47:00
# User@Host: root[root] @ localhost []
# Query_time: 0.000652 Lock_time: 0.000109 Rows_sent: 50
# Rows_examined: 3268
SELECT ...
Протоколирование запросов
• Таблица могла быть заблокирована, поэтому запрос был
вынужден ждать. Величина Lock_time показывает, как долго
запрос ждал освобождения блокировки.
• Данные или индексы могли к тому моменту еще отсутствовать
в кэше. Это обычный случай, когда сервер MySQL только
запущен или не настроен должным образом.
• Мог идти ночной процесс резервного копирования, из-за чего
все операции дискового ввода/вывода замедлялись.
• Сервер мог обрабатывать в тот момент другие запросы,
поэтому данный выполнялся медленнее.
Протоколирование запросов
Долго выполняющиеся запросы
Периодические выполняемые пакетные задания
действительно могут запускать долго выполняющиеся
запросы, но обычные запросы не должны занимать много
времени.
Запросы, больше всего нагружающие сервер
Ищите запросы, которые потребляют большую часть времени
сервера. Напомним, что короткие запросы, выполняемые
очень часто, тоже могут занимать много времени.
Новые запросы
Ищите запросы, которых вчера не было в первой сотне, а
сегодня они появились. Это могут быть новые запросы или
запросы, которые обычно выполнялись быстро, а теперь
замедлились из-за изменившейся схемы индексации. Либо
произошли еще какие-то изменения.
Профилирование запросов
SET profiling = 1;
SELECT SQL_NO_CACHE `movie`.`mID`, COUNT(*)
FROM `movie`
INNER JOIN `rating` USING(`mID`)
GROUP BY `movie`.`mID`
ORDER BY COUNT(*) DESC;
SHOW PROFILESG
******************** 1. row *********************
Query_ID: 1
Duration: 0.02596900
Query: SELECT …
EXPLAIN for UPDATE
UPDATE sakila.actor
INNER JOIN sakila.film_actor USING
(actor_id)
SET
actor.last_update=film_actor.last_update;
EXPLAIN for UPDATE
UPDATE sakila.actor
INNER JOIN sakila.film_actor USING
(actor_id)
SET
actor.last_update=film_actor.last_update;
EXPLAIN SELECT film_actor.actor_id
FROM sakila.actor INNER JOIN
sakila.film_actor USING (actor_id)G
***** 1. row *****
id: 1
select_type: SIMPLE
table: actor
type: index
possible_keys: PRIMARY
key: PRIMARY
key_len: 2
ref: NULL
rows: 200
Extra: Using index
***** 2. row *****
id: 1
select_type: SIMPLE
table: film_actor
type: ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 2
ref: sakila.actor.actor_id
rows: 13
Extra: Using index
EXPLAIN for UPDATE
UPDATE sakila.actor
INNER JOIN sakila.film_actor USING
(actor_id)
SET
actor.last_update=film_actor.last_update;
EXPLAIN SELECT
film_actor.last_update,
actor.last_update
FROM sakila.actor
INNER JOIN sakila.film_actor USING
(actor_id)G
***** 1. row *****
id: 1
select_type: SIMPLE
table: actor
type: ALL
possible_keys: PRIMARY
key: NULL
key_len: NULL
ref: NULL
rows: 200
Extra:
***** 2. row *****
id: 1
select_type: SIMPLE
table: film_actor
type: ref
possible_keys: PRIMARY
key: PRIMARY
key_len: 2
ref: sakila.actor.actor_id
rows: 13
Extra:
Стратегия индексирования
Изоляция столбца
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
SELECT ... WHERE
TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
Стратегия индексирования
Изоляция столбца
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
SELECT ... WHERE
TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
SELECT ... WHERE
date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
Стратегия индексирования
Изоляция столбца
SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
SELECT ... WHERE
TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
SELECT ... WHERE
date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
SELECT ... WHERE
date_col >= DATE_SUB(2008-01-17, INTERVAL 10 DAY);
Стратегия индексирования
Кластерные индексы
Стратегия индексирования
Кластерные индексы (+)
• Вы можете хранить связанные данные рядом.
• Быстрый доступ к данным. Кластерный индекс
хранит и индекс, и данные вместе в одной B-Tree
структуре, поэтому извлечение строк из кластерного
индекса обычно происходит быстрее, чем
сопоставимый поиск в некластерном индексе.
• Использующие покрывающие индексы запросы
могут получить значение первичного ключа из
листового узла.
Стратегия индексирования
Кластерные индексы (-)
• Если данные помещаются в памяти, то порядок доступа к ним не имеет
значения, и тогда кластерные индексы не принесут большой пользы.
• Если вы загружаете большое количество данных в другом порядке, то по
окончании загрузки имеет смысл реорганизовать таблицу с помощью команды
OPTIMIZE TABLE.
• Обновление столбцов кластерного индекса обходится дорого, поскольку
InnoDB вынуждена перемещать каждую обновленную строку в новое место.
• Для таблиц с кластерным индексом вставка новых строк или обновление
первичного ключа, требующее перемещения строки, может приводить к
расщеплению страницы.
• Полное сканирование кластерных таблиц может оказаться более медленным,
особенно если строки упакованы менее плотно или хранятся
непоследовательно из-за расщепления страниц.
• Вторичные (некластерные) индексы могут оказаться больше, чем вы ожидаете,
поскольку в листовых узлах хранятся значения столбцов, составляющих
первичный ключ.
• Для доступа к данным по вторичному индексу требуется просмотр двух
индексов вместо одного.
Стратегия индексирования
Размещение данных в MyISAM
CREATE TABLE
layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
Стратегия индексирования
Размещение данных в MyISAM
CREATE TABLE
layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
Стратегия индексирования
Размещение данных в InnoDB
Стратегия индексирования
Размещение данных в InnoDB
Стратегия индексирования
Размещение данных
Стратегия индексирования
Размещение данных
Покрывающие индексы
• Записи индекса обычно компактнее полной строки, поэтому, если
MySQL читает только индекс, то обращается к значительно меньшему
объему данных.
• Индексы отсортированы по индексируемым значениям (по крайней
мере, внутри страницы), поэтому для поиска по диапазону,
характеризуемому большим объемом ввода/вывода, потребуется
меньше операций обращения к диску.
• Большинство подсистем хранения кэширует индексы лучше, чем сами
данные.
• Покрывающие индексы особенно полезны в случае таблиц InnoDB из-за
кластерных индексов. Вторичные индексы InnoDB хранят значения
первичного ключа строки в листовых узлах. Таким образом, вторичный
индекс, который «покрывает» запрос, позволяет избежать еще одного
поиска по первичному индексу.
Покрывающие индексы
EXPLAIN SELECT store_id, film_id
FROM sakila.inventoryG
************************** 1. row **************************
id: 1
select_type: SIMPLE
table: inventory
type: index
possible_keys: NULL
key: idx_store_id_film_id
key_len: 3
ref: NULL
rows: 4673
Extra: Using index
Покрывающие индексы
EXPLAIN SELECT actor_id, last_name
FROM sakila.actor WHERE last_name = HOPPERG
************************** 1. row **************************
id: 1
select_type: SIMPLE
table: actor
type: ref
possible_keys: idx_actor_last_name
key: idx_actor_last_name
key_len: 137
ref: const
rows: 2
Extra: Using where; Using index
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25
ORDER BY inventory_id, customer_idG
************************** 1. row **************************
type: ref
possible_keys: rental_date
key: rental_date
rows: 1
Extra: Using where
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25
ORDER BY inventory_id DESC;
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25
ORDER BY inventory_id DESC, customer_id ASC;
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25
ORDER BY inventory_id, staff_id;
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date > 2005-05-25
ORDER BY rental_date, inventory_id;
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25
ORDER BY customer_id;
Покрывающие индексы
CREATE TABLE rental (
...
PRIMARY KEY (rental_id),
UNIQUE KEY rental_date (rental_date,inventory_id,customer_id),
KEY idx_fk_inventory_id (inventory_id),
KEY idx_fk_customer_id (customer_id),
KEY idx_fk_staff_id (staff_id),
...
);
EXPLAIN SELECT rental_id, staff_id FROM sakila.rental
WHERE rental_date = 2005-05-25 AND inventory_id IN(1,2)
ORDER BY customer_id;
Нормализация
• Нормализованные таблицы обычно обновляются быстрее,
чем ненормализованные.
• Когда данные хорошо нормализованы, они либо редко
дублируются, либо не дублируются совсем. Так что изменять
приходится меньше данных.
• Нормализованные таблицы обычно меньше по размеру,
поэтому лучше помещаются в памяти и их
производительность выше.
• Из-за отсутствия избыточных данных реже возникает
необходимость в запросах с фразами DISTINCT или GROUP
BY для извлечения списков значений.
Денормализация
• Все данные находятся в одной и той же таблице, что
позволяет избежать соединений.
• Более эффективные стратегии индексирования
SELECT message_text, user_name
FROM message
INNER JOIN user ON message.user_id=user.id
WHERE user.account_type=premium
ORDER BY message.published DESC LIMIT 10;
SELECT message_text,user_name
FROM user_messages
WHERE account_type=premium
ORDER BY published DESC
LIMIT 10;
Денормализация
Таблицы счетчиков
CREATE TABLE hit_counter (
cnt int unsigned not null
) ENGINE=InnoDB;
UPDATE hit_counter SET cnt = cnt + 1;
Денормализация
Таблицы счетчиков
CREATE TABLE hit_counter (
slot tinyint unsigned not null primary
key,
cnt int unsigned not null
) ENGINE=InnoDB;
UPDATE hit_counter SET cnt = cnt + 1 WHERE
slot = RAND( ) * 100;
SELECT SUM(cnt) FROM hit_counter;
Денормализация
Таблицы счетчиков
CREATE TABLE daily_hit_counter (
day date not null,
slot tinyint unsigned not null,
cnt int unsigned not null,
primary key(day, slot)
) ENGINE=InnoDB;
INSERT INTO daily_hit_counter(day, slot, cnt)
VALUES (CURRENT_DATE, RAND( ) * 100, 1)
ON DUPLICATE KEY UPDATE cnt = cnt + 1;
Версионирование схемы БД
• любую версию базы данных можно обновить до любой (обычно,
самой последней) версии;
• набор SQL-запросов, реализующих миграцию между любыми двумя
версиями, можно было получить как можно быстрее и проще;
• всегда можно создать с нуля базу данных со структурой самой
последней версии
• в случае работы над разными ветками, при последующем их слиянии
ручное редактирование файлов БД было сведено к минимуму;
• откатить БД на более раннюю версию так же просто, как и обновить на
более новую
Метод
инкрементных изменений
•Database
|- Baseline.sql
|- 0001.03.01.sql
|- 0002.03.01.sql
|- 0003.03.01.sql
|- 0004.03.02.sql
|- 0005.03.02.sql
|- 0006.03.02.sql
|- 0007.03.02.sql
CREATE TABLE MigrationHistory
(
Id INT,
MajorVersion VARCHAR(2),
MinorVersion VARCHAR(2),
FileNumber VARCHAR(4),
Comment VARCHAR(255),
DateApplied DATETIME,
PRIMARY KEY(Id)
)
INSERT INTO
MigrationHistory ( MajorVersion, MinorVersion,
FileNumber, Comment, DateApplied )
VALUES ('03', '01', '0000', 'Baseline', NOW())
Метод
инкрементных изменений
• Быстрое и удобное выполнение миграции до последней версии;
• Механизм нумерации версий. Номер текущей версии хранится прямо в
БД;
• Для максимального удобства нужны средства автоматизации
выполнения миграций;
• Неудобно добавлять комментарии к структуре БД.;
• Возникают проблемы в процессе параллельной разработки в
нескольких ветках репозитория.
Метод
идемпотентных изменений
•Database
|- 3.01
| |- Baseline.sql
| | - Changes.sql
|
| - 3.02
|- Baseline.sql
|- Changes.sql
IF NOT EXISTS
(
SELECT *
FROM information_schema.tables
WHERE table_name = 'myTable'
AND table_schema = 'myDb'
)
THEN
CREATE TABLE myTable
(
id INT(10) NOT NULL,
myField VARCHAR(255) NULL,
PRIMARY KEY(id)
);
END IF;
Метод
идемпотентных изменений
• Очень удобное выполнение миграций с любой промежуточной версии
до последней — нужно всего лишь выполнить на базе данных один
файл (Changes.sql);
• Потенциально возможны ситуации, в которых будут теряться данные,
за этим придется следить.
• Для того, чтобы изменения были идемпотентными, нужно потратить
больше времени (и кода) на их написание.
Метод уподобления структуры
БД исходному коду
Удобно наблюдать изменения в структуре между версиями при помощи
средств системы контроля версий;
Как и любой исходный код, структуру БД удобно комментировать;
Для того, чтобы с нуля создать чистую базу данных последней версии,
нужно выполнить всего лишь один файл;
Скрипты-миграции более надежны, чем в других методах, так как
генерируются автоматически;
Мигрировать с новых версий на старые почти так же просто, как со старых
на новые (проблемы могут возникнуть только с пресловутыми изменениями
данных);
В случае слияния двух веток репозитория, merge структуры БД
осуществляется проще, чем при использовании других подходов;
Метод уподобления структуры
БД исходному коду
Изменения данных придется хранить отдельно, и затем вручную
вставлять в сгенерированные скрипты-миграции;
Вручную выполнять миграции очень неудобно, необходимы
автоматизированные средства.
Спасибо за внимание
Павел Щербинин
p.scherbinin@corp.mail.ru

Contenu connexe

Tendances

Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Alexey Kovyazin
 
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
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3Technopark
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. RussianRawan Qurmet
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.Sergey Petrunya
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8Technopark
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugAndrey Tokarchuk
 
Доклад Сергея Аверина на 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, но не смогли нагуглить / Сергей Авер...Ontico
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9Technopark
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9Technopark
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1Technopark
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийSveta Smirnova
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровPositive Hack Days
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXMLSlach
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2Technopark
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJSYura Bogdanov
 

Tendances (19)

Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0Новые возможности языка SQL в Firebird 3.0
Новые возможности языка SQL в Firebird 3.0
 
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)
 
Web осень 2013 лекция 3
Web осень 2013 лекция 3Web осень 2013 лекция 3
Web осень 2013 лекция 3
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
My sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmugMy sql 5.6-new-stable-mmug
My sql 5.6-new-stable-mmug
 
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
Доклад Сергея Аверина на CodeFest-2013. "MySQL+HandlerSocket=NoSQL".
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить / Сергей Авер...
 
Web осень 2013 лекция 9
Web осень 2013 лекция 9Web осень 2013 лекция 9
Web осень 2013 лекция 9
 
СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9СУБД осень 2012 лекция 9
СУБД осень 2012 лекция 9
 
Web осень 2013 лекция 1
Web осень 2013 лекция 1Web осень 2013 лекция 1
Web осень 2013 лекция 1
 
Введение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложенийВведение в отладку производительности MySQL приложений
Введение в отладку производительности MySQL приложений
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
XML Native Database на примере SednaXML
XML Native Database на примере SednaXMLXML Native Database на примере SednaXML
XML Native Database на примере SednaXML
 
Web осень 2013 лекция 2
Web осень 2013 лекция 2Web осень 2013 лекция 2
Web осень 2013 лекция 2
 
Эффективное программирование на NodeJS
Эффективное программирование на NodeJSЭффективное программирование на NodeJS
Эффективное программирование на NodeJS
 

En vedette

СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"Technopark
 
Android осень 2013 лекция 1
Android осень 2013 лекция 1Android осень 2013 лекция 1
Android осень 2013 лекция 1Technopark
 
Разработка веб-сервисов осень 2013 лекция 9
Разработка веб-сервисов осень 2013 лекция 9Разработка веб-сервисов осень 2013 лекция 9
Разработка веб-сервисов осень 2013 лекция 9Technopark
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Technopark
 
Безопасность интернет-приложений осень 2013 лекция 2
Безопасность интернет-приложений осень 2013 лекция 2Безопасность интернет-приложений осень 2013 лекция 2
Безопасность интернет-приложений осень 2013 лекция 2Technopark
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3Technopark
 
Безопасность интернет-приложений осень 2013 лекция 10
Безопасность интернет-приложений осень 2013 лекция 10Безопасность интернет-приложений осень 2013 лекция 10
Безопасность интернет-приложений осень 2013 лекция 10Technopark
 
HighLoad весна 2014 лекция 3
HighLoad весна 2014 лекция 3HighLoad весна 2014 лекция 3
HighLoad весна 2014 лекция 3Technopark
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Technopark
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Technopark
 
Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Technopark
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8Technopark
 
Разработка веб-сервисов осень 2013 лекция 1 2
Разработка веб-сервисов осень 2013 лекция 1 2Разработка веб-сервисов осень 2013 лекция 1 2
Разработка веб-сервисов осень 2013 лекция 1 2Technopark
 
HighLoad весна 2014 лекция 6
HighLoad весна 2014 лекция 6HighLoad весна 2014 лекция 6
HighLoad весна 2014 лекция 6Technopark
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8Technopark
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Technopark
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Technopark
 

En vedette (20)

СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"СУБД 2013 Лекция №1 "Введение и начало проектирования"
СУБД 2013 Лекция №1 "Введение и начало проектирования"
 
Android осень 2013 лекция 1
Android осень 2013 лекция 1Android осень 2013 лекция 1
Android осень 2013 лекция 1
 
Разработка веб-сервисов осень 2013 лекция 9
Разработка веб-сервисов осень 2013 лекция 9Разработка веб-сервисов осень 2013 лекция 9
Разработка веб-сервисов осень 2013 лекция 9
 
Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2Frontend весна 2014 лекция 2
Frontend весна 2014 лекция 2
 
Безопасность интернет-приложений осень 2013 лекция 2
Безопасность интернет-приложений осень 2013 лекция 2Безопасность интернет-приложений осень 2013 лекция 2
Безопасность интернет-приложений осень 2013 лекция 2
 
Java осень 2014 занятие 3
Java осень 2014 занятие 3Java осень 2014 занятие 3
Java осень 2014 занятие 3
 
Безопасность интернет-приложений осень 2013 лекция 10
Безопасность интернет-приложений осень 2013 лекция 10Безопасность интернет-приложений осень 2013 лекция 10
Безопасность интернет-приложений осень 2013 лекция 10
 
HighLoad весна 2014 лекция 3
HighLoad весна 2014 лекция 3HighLoad весна 2014 лекция 3
HighLoad весна 2014 лекция 3
 
Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5Управление продуктом осень 2013 лекция 5
Управление продуктом осень 2013 лекция 5
 
Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2Тестирование весна 2014 смешанное занятие 2
Тестирование весна 2014 смешанное занятие 2
 
Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1Java осень 2013 лекция 1-1
Java осень 2013 лекция 1-1
 
Java осень 2013 лекция 8
Java осень 2013 лекция 8Java осень 2013 лекция 8
Java осень 2013 лекция 8
 
Разработка веб-сервисов осень 2013 лекция 1 2
Разработка веб-сервисов осень 2013 лекция 1 2Разработка веб-сервисов осень 2013 лекция 1 2
Разработка веб-сервисов осень 2013 лекция 1 2
 
HighLoad весна 2014 лекция 6
HighLoad весна 2014 лекция 6HighLoad весна 2014 лекция 6
HighLoad весна 2014 лекция 6
 
Java осень 2014 занятие 8
Java осень 2014 занятие 8Java осень 2014 занятие 8
Java осень 2014 занятие 8
 
Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2Алгоритмы и структуры данных весна 2014 лекция 2
Алгоритмы и структуры данных весна 2014 лекция 2
 
Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3Тестирование весна 2014 смешанное занятие 3
Тестирование весна 2014 смешанное занятие 3
 

Similaire à СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы"

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINAlexey Ermakov
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросыNikolay Samokhvalov
 
Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQLPavel Zyukin
 
Обработка дедлоков в MySql
Обработка дедлоков в MySqlОбработка дедлоков в MySql
Обработка дедлоков в MySqlspariev
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)AvitoTech
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...it-people
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данныхmcroitor
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"railsclub
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...Alex Tumanoff
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьphp-user-group-minsk
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовAlex.Kolonitsky
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlOleksandr Petrov
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderАлександр Брич
 

Similaire à СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы" (20)

Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Как читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAINКак читать и интерпретировать вывод команды EXPLAIN
Как читать и интерпретировать вывод команды EXPLAIN
 
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы#RuPostgresLive 4: как писать и читать сложные SQL-запросы
#RuPostgresLive 4: как писать и читать сложные SQL-запросы
 
Индексы в MySQL
Индексы в MySQLИндексы в MySQL
Индексы в MySQL
 
Обработка дедлоков в MySql
Обработка дедлоков в MySqlОбработка дедлоков в MySql
Обработка дедлоков в MySql
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)
 
django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
 
C++ и базы данных
C++ и базы данныхC++ и базы данных
C++ и базы данных
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"
 
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So..."AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
"AnnotatedSQL - провайдер с плюшками за 5 минут" - Геннадий Дубина, Senior So...
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьТо, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
 
Class queries
Class queriesClass queries
Class queries
 
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher SqlAlexander Dymo - Barcamp 2009 - Faster Higher Sql
Alexander Dymo - Barcamp 2009 - Faster Higher Sql
 
Adymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher SqlAdymo Barcamp Presentation Faster Higher Sql
Adymo Barcamp Presentation Faster Higher Sql
 
Лекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, LoaderЛекция Android. БД SQLite, ContentProvider, Loader
Лекция Android. БД SQLite, ContentProvider, Loader
 

Plus de Technopark

Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuTechnopark
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARNTechnopark
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. SparkTechnopark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache MahoutTechnopark
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeperTechnopark
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveTechnopark
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Technopark
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Technopark
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Technopark
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSTechnopark
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы HadoopTechnopark
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceTechnopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"Technopark
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...Technopark
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7Technopark
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6Technopark
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1Technopark
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2Technopark
 

Plus de Technopark (19)

Лекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.RuЛекция 14. Hadoop в Поиске Mail.Ru
Лекция 14. Hadoop в Поиске Mail.Ru
 
Лекция 13. YARN
Лекция 13. YARNЛекция 13. YARN
Лекция 13. YARN
 
Лекция 12. Spark
Лекция 12. SparkЛекция 12. Spark
Лекция 12. Spark
 
Лекция 10. Apache Mahout
Лекция 10. Apache MahoutЛекция 10. Apache Mahout
Лекция 10. Apache Mahout
 
Лекция 9. ZooKeeper
Лекция 9. ZooKeeperЛекция 9. ZooKeeper
Лекция 9. ZooKeeper
 
Лекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и HiveЛекция 7. Введение в Pig и Hive
Лекция 7. Введение в Pig и Hive
 
Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)Лекция 6. MapReduce в Hadoop (графы)
Лекция 6. MapReduce в Hadoop (графы)
 
Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)Лекция 5. MapReduce в Hadoop (алгоритмы)
Лекция 5. MapReduce в Hadoop (алгоритмы)
 
Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)Лекция 4. MapReduce в Hadoop (введение)
Лекция 4. MapReduce в Hadoop (введение)
 
Лекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFSЛекция 3. Распределённая файловая система HDFS
Лекция 3. Распределённая файловая система HDFS
 
Лекция 2. Основы Hadoop
Лекция 2. Основы HadoopЛекция 2. Основы Hadoop
Лекция 2. Основы Hadoop
 
Лекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduceЛекция 1. Введение в Big Data и MapReduce
Лекция 1. Введение в Big Data и MapReduce
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL"
 
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
СУБД 2013 Лекция №10 "Нереляционное решение в области баз данных — NoSQL" Час...
 
Java осень 2014 занятие 7
Java осень 2014 занятие 7Java осень 2014 занятие 7
Java осень 2014 занятие 7
 
Java осень 2014 занятие 6
Java осень 2014 занятие 6Java осень 2014 занятие 6
Java осень 2014 занятие 6
 
Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Java осень 2014 занятие 1
Java осень 2014 занятие 1Java осень 2014 занятие 1
Java осень 2014 занятие 1
 
Java осень 2014 занятие 2
Java осень 2014 занятие 2Java осень 2014 занятие 2
Java осень 2014 занятие 2
 

СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-запросы"

  • 2. Профилирование • К каким данным MySQL обращается чаще всего • Какие типы запросов MySQL выполняет чаще всего • В каких состояниях преимущественно находятся потоки (threads) MySQL • Какие подсистемы MySQL чаще всего использует для выполнения запросов • Какие виды обращения к данным встречаются наиболее часто • Сколько различных видов действий, например просмотра индексов, выполняет MySQL
  • 3. Протоколирование запросов Общий журнал log = <имя_файла> Журнал медленных запросов log-slow-queries = <имя_файла> long_query_time = 2 log-queries-not-using-indexes log-slow-admin-statements # Time: 121018 9:47:00 # User@Host: root[root] @ localhost [] # Query_time: 0.000652 Lock_time: 0.000109 Rows_sent: 50 # Rows_examined: 3268 SELECT ...
  • 4. Протоколирование запросов • Таблица могла быть заблокирована, поэтому запрос был вынужден ждать. Величина Lock_time показывает, как долго запрос ждал освобождения блокировки. • Данные или индексы могли к тому моменту еще отсутствовать в кэше. Это обычный случай, когда сервер MySQL только запущен или не настроен должным образом. • Мог идти ночной процесс резервного копирования, из-за чего все операции дискового ввода/вывода замедлялись. • Сервер мог обрабатывать в тот момент другие запросы, поэтому данный выполнялся медленнее.
  • 5. Протоколирование запросов Долго выполняющиеся запросы Периодические выполняемые пакетные задания действительно могут запускать долго выполняющиеся запросы, но обычные запросы не должны занимать много времени. Запросы, больше всего нагружающие сервер Ищите запросы, которые потребляют большую часть времени сервера. Напомним, что короткие запросы, выполняемые очень часто, тоже могут занимать много времени. Новые запросы Ищите запросы, которых вчера не было в первой сотне, а сегодня они появились. Это могут быть новые запросы или запросы, которые обычно выполнялись быстро, а теперь замедлились из-за изменившейся схемы индексации. Либо произошли еще какие-то изменения.
  • 6. Профилирование запросов SET profiling = 1; SELECT SQL_NO_CACHE `movie`.`mID`, COUNT(*) FROM `movie` INNER JOIN `rating` USING(`mID`) GROUP BY `movie`.`mID` ORDER BY COUNT(*) DESC; SHOW PROFILESG ******************** 1. row ********************* Query_ID: 1 Duration: 0.02596900 Query: SELECT …
  • 7. EXPLAIN for UPDATE UPDATE sakila.actor INNER JOIN sakila.film_actor USING (actor_id) SET actor.last_update=film_actor.last_update;
  • 8. EXPLAIN for UPDATE UPDATE sakila.actor INNER JOIN sakila.film_actor USING (actor_id) SET actor.last_update=film_actor.last_update; EXPLAIN SELECT film_actor.actor_id FROM sakila.actor INNER JOIN sakila.film_actor USING (actor_id)G ***** 1. row ***** id: 1 select_type: SIMPLE table: actor type: index possible_keys: PRIMARY key: PRIMARY key_len: 2 ref: NULL rows: 200 Extra: Using index ***** 2. row ***** id: 1 select_type: SIMPLE table: film_actor type: ref possible_keys: PRIMARY key: PRIMARY key_len: 2 ref: sakila.actor.actor_id rows: 13 Extra: Using index
  • 9. EXPLAIN for UPDATE UPDATE sakila.actor INNER JOIN sakila.film_actor USING (actor_id) SET actor.last_update=film_actor.last_update; EXPLAIN SELECT film_actor.last_update, actor.last_update FROM sakila.actor INNER JOIN sakila.film_actor USING (actor_id)G ***** 1. row ***** id: 1 select_type: SIMPLE table: actor type: ALL possible_keys: PRIMARY key: NULL key_len: NULL ref: NULL rows: 200 Extra: ***** 2. row ***** id: 1 select_type: SIMPLE table: film_actor type: ref possible_keys: PRIMARY key: PRIMARY key_len: 2 ref: sakila.actor.actor_id rows: 13 Extra:
  • 10. Стратегия индексирования Изоляция столбца SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
  • 11. Стратегия индексирования Изоляция столбца SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10; SELECT ... WHERE date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
  • 12. Стратегия индексирования Изоляция столбца SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10; SELECT ... WHERE date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY); SELECT ... WHERE date_col >= DATE_SUB(2008-01-17, INTERVAL 10 DAY);
  • 14. Стратегия индексирования Кластерные индексы (+) • Вы можете хранить связанные данные рядом. • Быстрый доступ к данным. Кластерный индекс хранит и индекс, и данные вместе в одной B-Tree структуре, поэтому извлечение строк из кластерного индекса обычно происходит быстрее, чем сопоставимый поиск в некластерном индексе. • Использующие покрывающие индексы запросы могут получить значение первичного ключа из листового узла.
  • 15. Стратегия индексирования Кластерные индексы (-) • Если данные помещаются в памяти, то порядок доступа к ним не имеет значения, и тогда кластерные индексы не принесут большой пользы. • Если вы загружаете большое количество данных в другом порядке, то по окончании загрузки имеет смысл реорганизовать таблицу с помощью команды OPTIMIZE TABLE. • Обновление столбцов кластерного индекса обходится дорого, поскольку InnoDB вынуждена перемещать каждую обновленную строку в новое место. • Для таблиц с кластерным индексом вставка новых строк или обновление первичного ключа, требующее перемещения строки, может приводить к расщеплению страницы. • Полное сканирование кластерных таблиц может оказаться более медленным, особенно если строки упакованы менее плотно или хранятся непоследовательно из-за расщепления страниц. • Вторичные (некластерные) индексы могут оказаться больше, чем вы ожидаете, поскольку в листовых узлах хранятся значения столбцов, составляющих первичный ключ. • Для доступа к данным по вторичному индексу требуется просмотр двух индексов вместо одного.
  • 16. Стратегия индексирования Размещение данных в MyISAM CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 17. Стратегия индексирования Размещение данных в MyISAM CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 22. Покрывающие индексы • Записи индекса обычно компактнее полной строки, поэтому, если MySQL читает только индекс, то обращается к значительно меньшему объему данных. • Индексы отсортированы по индексируемым значениям (по крайней мере, внутри страницы), поэтому для поиска по диапазону, характеризуемому большим объемом ввода/вывода, потребуется меньше операций обращения к диску. • Большинство подсистем хранения кэширует индексы лучше, чем сами данные. • Покрывающие индексы особенно полезны в случае таблиц InnoDB из-за кластерных индексов. Вторичные индексы InnoDB хранят значения первичного ключа строки в листовых узлах. Таким образом, вторичный индекс, который «покрывает» запрос, позволяет избежать еще одного поиска по первичному индексу.
  • 23. Покрывающие индексы EXPLAIN SELECT store_id, film_id FROM sakila.inventoryG ************************** 1. row ************************** id: 1 select_type: SIMPLE table: inventory type: index possible_keys: NULL key: idx_store_id_film_id key_len: 3 ref: NULL rows: 4673 Extra: Using index
  • 24. Покрывающие индексы EXPLAIN SELECT actor_id, last_name FROM sakila.actor WHERE last_name = HOPPERG ************************** 1. row ************************** id: 1 select_type: SIMPLE table: actor type: ref possible_keys: idx_actor_last_name key: idx_actor_last_name key_len: 137 ref: const rows: 2 Extra: Using where; Using index
  • 25. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 ORDER BY inventory_id, customer_idG ************************** 1. row ************************** type: ref possible_keys: rental_date key: rental_date rows: 1 Extra: Using where
  • 26. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 ORDER BY inventory_id DESC;
  • 27. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 ORDER BY inventory_id DESC, customer_id ASC;
  • 28. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 ORDER BY inventory_id, staff_id;
  • 29. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date > 2005-05-25 ORDER BY rental_date, inventory_id;
  • 30. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 ORDER BY customer_id;
  • 31. Покрывающие индексы CREATE TABLE rental ( ... PRIMARY KEY (rental_id), UNIQUE KEY rental_date (rental_date,inventory_id,customer_id), KEY idx_fk_inventory_id (inventory_id), KEY idx_fk_customer_id (customer_id), KEY idx_fk_staff_id (staff_id), ... ); EXPLAIN SELECT rental_id, staff_id FROM sakila.rental WHERE rental_date = 2005-05-25 AND inventory_id IN(1,2) ORDER BY customer_id;
  • 32. Нормализация • Нормализованные таблицы обычно обновляются быстрее, чем ненормализованные. • Когда данные хорошо нормализованы, они либо редко дублируются, либо не дублируются совсем. Так что изменять приходится меньше данных. • Нормализованные таблицы обычно меньше по размеру, поэтому лучше помещаются в памяти и их производительность выше. • Из-за отсутствия избыточных данных реже возникает необходимость в запросах с фразами DISTINCT или GROUP BY для извлечения списков значений.
  • 33. Денормализация • Все данные находятся в одной и той же таблице, что позволяет избежать соединений. • Более эффективные стратегии индексирования SELECT message_text, user_name FROM message INNER JOIN user ON message.user_id=user.id WHERE user.account_type=premium ORDER BY message.published DESC LIMIT 10; SELECT message_text,user_name FROM user_messages WHERE account_type=premium ORDER BY published DESC LIMIT 10;
  • 34. Денормализация Таблицы счетчиков CREATE TABLE hit_counter ( cnt int unsigned not null ) ENGINE=InnoDB; UPDATE hit_counter SET cnt = cnt + 1;
  • 35. Денормализация Таблицы счетчиков CREATE TABLE hit_counter ( slot tinyint unsigned not null primary key, cnt int unsigned not null ) ENGINE=InnoDB; UPDATE hit_counter SET cnt = cnt + 1 WHERE slot = RAND( ) * 100; SELECT SUM(cnt) FROM hit_counter;
  • 36. Денормализация Таблицы счетчиков CREATE TABLE daily_hit_counter ( day date not null, slot tinyint unsigned not null, cnt int unsigned not null, primary key(day, slot) ) ENGINE=InnoDB; INSERT INTO daily_hit_counter(day, slot, cnt) VALUES (CURRENT_DATE, RAND( ) * 100, 1) ON DUPLICATE KEY UPDATE cnt = cnt + 1;
  • 37. Версионирование схемы БД • любую версию базы данных можно обновить до любой (обычно, самой последней) версии; • набор SQL-запросов, реализующих миграцию между любыми двумя версиями, можно было получить как можно быстрее и проще; • всегда можно создать с нуля базу данных со структурой самой последней версии • в случае работы над разными ветками, при последующем их слиянии ручное редактирование файлов БД было сведено к минимуму; • откатить БД на более раннюю версию так же просто, как и обновить на более новую
  • 38. Метод инкрементных изменений •Database |- Baseline.sql |- 0001.03.01.sql |- 0002.03.01.sql |- 0003.03.01.sql |- 0004.03.02.sql |- 0005.03.02.sql |- 0006.03.02.sql |- 0007.03.02.sql CREATE TABLE MigrationHistory ( Id INT, MajorVersion VARCHAR(2), MinorVersion VARCHAR(2), FileNumber VARCHAR(4), Comment VARCHAR(255), DateApplied DATETIME, PRIMARY KEY(Id) ) INSERT INTO MigrationHistory ( MajorVersion, MinorVersion, FileNumber, Comment, DateApplied ) VALUES ('03', '01', '0000', 'Baseline', NOW())
  • 39. Метод инкрементных изменений • Быстрое и удобное выполнение миграции до последней версии; • Механизм нумерации версий. Номер текущей версии хранится прямо в БД; • Для максимального удобства нужны средства автоматизации выполнения миграций; • Неудобно добавлять комментарии к структуре БД.; • Возникают проблемы в процессе параллельной разработки в нескольких ветках репозитория.
  • 40. Метод идемпотентных изменений •Database |- 3.01 | |- Baseline.sql | | - Changes.sql | | - 3.02 |- Baseline.sql |- Changes.sql IF NOT EXISTS ( SELECT * FROM information_schema.tables WHERE table_name = 'myTable' AND table_schema = 'myDb' ) THEN CREATE TABLE myTable ( id INT(10) NOT NULL, myField VARCHAR(255) NULL, PRIMARY KEY(id) ); END IF;
  • 41. Метод идемпотентных изменений • Очень удобное выполнение миграций с любой промежуточной версии до последней — нужно всего лишь выполнить на базе данных один файл (Changes.sql); • Потенциально возможны ситуации, в которых будут теряться данные, за этим придется следить. • Для того, чтобы изменения были идемпотентными, нужно потратить больше времени (и кода) на их написание.
  • 42. Метод уподобления структуры БД исходному коду Удобно наблюдать изменения в структуре между версиями при помощи средств системы контроля версий; Как и любой исходный код, структуру БД удобно комментировать; Для того, чтобы с нуля создать чистую базу данных последней версии, нужно выполнить всего лишь один файл; Скрипты-миграции более надежны, чем в других методах, так как генерируются автоматически; Мигрировать с новых версий на старые почти так же просто, как со старых на новые (проблемы могут возникнуть только с пресловутыми изменениями данных); В случае слияния двух веток репозитория, merge структуры БД осуществляется проще, чем при использовании других подходов;
  • 43. Метод уподобления структуры БД исходному коду Изменения данных придется хранить отдельно, и затем вручную вставлять в сгенерированные скрипты-миграции; Вручную выполнять миграции очень неудобно, необходимы автоматизированные средства.
  • 44. Спасибо за внимание Павел Щербинин p.scherbinin@corp.mail.ru