SlideShare ist ein Scribd-Unternehmen logo
1 von 51
• К каким данным 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 только
запущен или не настроен должным образом.
• Мог идти ночной процесс резервного копирования, из-за чего
все операции дискового ввода/вывода замедлялись.
• Сервер мог обрабатывать в тот момент другие запросы,
поэтому данный выполнялся медленнее.
Долго выполняющиеся запросы
Периодические выполняемые пакетные задания
действительно могут запускать долго выполняющиеся
запросы, но обычные запросы не должны занимать много
времени.
Запросы, больше всего нагружающие сервер
Ищите запросы, которые потребляют большую часть времени
сервера. Напомним, что короткие запросы, выполняемые
очень часто, тоже могут занимать много времени.
Новые запросы
Ищите запросы, которых вчера не было в первой сотне, а
сегодня они появились. Это могут быть новые запросы или
запросы, которые обычно выполнялись быстро, а теперь
замедлились из-за изменившейся схемы индексации. Либо
произошли еще какие-то изменения.
SHOW STATUS
Bytes_received и Bytes_sent
Количество байтов, соответственно полученных и
отправленных сервером.
Com_*
Команды, которые сервер выполняет
Created_*
Временные таблицы и файлы, созданные во время
выполнения запроса
Handler_*
Операции подсистемы хранения
Select_*
Различные типы планов выполнения операции соединения
Sort_*
Разнообразная информация о сортировке
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 ничего не говорит о том, как влияют на запрос триггеры,
хранимые и пользовательские (UDF) функции.
• Она не работает с хранимыми процедурами, хотя можно
разложить процедуру на отдельные запросы и вызвать EXPLAIN
для каждого из них.
• Она ничего не говорит об оптимизациях, которые MySQL
производит уже на этапе выполнения запроса.
• Часть отображаемой статистической информации – всего лишь
оценка, иногда очень неточная.
• Она не показывает все, что можно было бы сообщить о плане
выполнения запроса
• Она не делает различий между некоторыми операциями,
называя их одинаково.
EXPLAIN SELECT (SELECT 1 FROM sakila.actor LIMIT 1) FROM sakila.film
id select_type table
1PRIMARY film
2SUBQUERY actor
EXPLAIN SELECT film_id FROM (SELECT film_id FROM sakila.film) AS der;
id select_type table
1PRIMARY <derived2>
2DERIVED film
EXPLAIN SELECT 1 UNION ALL SELECT 1;
id select_type table
1PRIMARY NULL
2UNION NULL
NULL UNION RESULT <union1,2>
PRIMARY
Самый внешний запрос
SUBQUERY
Запрос SELECT, который содержится в подзапросе, находящемся во
фразе SELECT (иными словами, не во фразе FROM
DERIVED
Значение DERIVED означает, что данный запрос SELECT является
подзапросом во фразе FROM.
UNION
Второй и последующий запросы SELECT, входящие в объединение
UNION, помечаются признаком UNION.
UNION RESULT
Запрос SELECT, применяемый для выборки результатов из
временной
таблицы, созданной в ходе выполнения UNION.
EXPLAIN SELECT film.film_id
FROM sakila.film
INNER JOIN sakila.film_actor USING(film_id)
INNER JOIN sakila.actor USING(actor_id);
id select_type table
1SIMPLE actor
1SIMPLE film_actor
1SIMPLE film
EXPLAIN SELECT actor_id,
(SELECT 1 FROM sakila.film_actor WHERE film_actor.actor_id = der_1.actor_id LIMIT 1)
FROM (
SELECT actor_id
FROM sakila.actor LIMIT 5
) AS der_1
UNION ALL
SELECT film_id,
(SELECT @var1 FROM sakila.rental LIMIT 1)
FROM (
SELECT film_id,
(SELECT 1 FROM sakila.store LIMIT 1)
FROM sakila.film LIMIT 5
) AS der_2;
id select_type table
1PRIMARY <derived3>
3DERIVED actor
2DEPENDENT SUBQUERY film_actor
4UNION <derived6>
6DERIVED film
7SUBQUERY store
5UNCACHEABLE SUBQUERY rental
NULL UNION RESULT <union1,4>
ALL
Этот подход обычно называют сканированием таблицы.
index
То же, что сканирование таблицы, только MySQL просматривает ее в порядке, задаваемом
индексом, а не в порядке следования строк.
range
Просмотр диапазона – это ограниченная форма сканирования индекса. Просмотр начинается
в определенной точке индекса и возвращает строки в некотором диапазоне значений.
ref
Это доступ по индексу (иногда он называется поиском по индексу (index lookup)), в результате
которого возвращаются строки, соответствующие единственному заданному значению.
eq_ref
Это поиск по индексу в случае, когда MySQL точно знает, что будет возвращено не более
одного значения.
const, system
Эти типы доступа MySQL применяет, когда в процессе оптимизации какую-то часть запроса
можно преобразовать в константу.
NULL
Этот метод означает, что MySQL сумела разрешить запрос на фазе оптимизации, так что в
ходе выполнения вообще не потребуется обращаться к таблице или индексу.
EXPLAIN SELECT actor_id, film_id FROM sakila.film_actorG
************************* 1. row *************************
id: 1
select_type: SIMPLE
table: film_actor
type: index
possible_keys: NULL
key: idx_fk_film_id
key_len: 2
ref: NULL
rows: 5143
Extra: Using index
EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4;
...| type | possible_keys | key | key_len |...
...| ref | PRIMARY | PRIMARY | 2 |...
EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4;
...| type | possible_keys | key | key_len |...
...| ref | PRIMARY | PRIMARY | 2 |...
CREATE TABLE t (
a char(3) NOT NULL,
b int(11) NOT NULL,
c char(1) NOT NULL,
PRIMARY KEY (a,b,c)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
EXPLAIN SELECT a FROM t WHERE a=’sak’ AND b = 112;
EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4;
...| type | possible_keys | key | key_len |...
...| ref | PRIMARY | PRIMARY | 2 |...
CREATE TABLE t (
a char(3) NOT NULL,
b int(11) NOT NULL,
c char(1) NOT NULL,
PRIMARY KEY (a,b,c)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
EXPLAIN SELECT a FROM t WHERE a=’sak’ AND b = 112;
... |type | possible_keys | key | key_len |...
... | ref | PRIMARY | PRIMARY | 13 |...
EXPLAIN SELECT STRAIGHT_JOIN f.film_id
FROM sakila.film AS f
INNER JOIN sakila.film_actor AS fa
ON f.film_id=fa.film_id AND fa.actor_id = 1
INNER JOIN sakila.actor AS a USING(actor_id);
...| table |...| key | key_len | ref |...
...| a |...| PRIMARY | 2 | const |...
...| f |...| idx_fk_language_id | 1 | NULL |...
...| fa |...| PRIMARY | 4 | const,sakila.f.film_id |...
EXPLAIN SELECT f.film_id
FROM sakila.film AS f
INNER JOIN sakila.film_actor AS fa USING(film_id)
INNER JOIN sakila.actor AS a USING(actor_id);
...| rows |...
...| 200 |...
...| 13 |...
...| 1 |...
Using index
Означает, что MySQL воспользуется покрывающим индексом, чтобы
избежать доступа к самой таблице.
Using where
Означает, что сервер произведет дополнительную фильтрацию
строк, отобранных подсистемой хранения.
Using temporary
Означает, что MySQL будет применять временную таблицу для сортировки
результатов запроса.
Using filesort
Означает, что MySQL прибегнет к обычной сортировке для упорядочения
результатов, а не станет читать строки из таблицы в порядке, задаваемом
индексом.
range checked for each record
Означает, что подходящего индекса не нашлось, поэтому сервер будет
заново искать индекс при обработке каждой строки в операции
соединения.
UPDATE sakila.actor
INNER JOIN sakila.film_actor USING (actor_id)
SET actor.last_update=film_actor.last_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
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 вынуждена перемещать каждую обновленную строку в новое место.
• Для таблиц с кластерным индексом вставка новых строк или обновление
первичного ключа, требующее перемещения строки, может приводить к
расщеплению страницы.
• Полное сканирование кластерных таблиц может оказаться более медленным,
особенно если строки упакованы менее плотно или хранятся
непоследовательно из-за расщепления страниц.
• Вторичные (некластерные) индексы могут оказаться больше, чем вы ожидаете,
поскольку в листовых узлах хранятся значения столбцов, составляющих
первичный ключ.
• Для доступа к данным по вторичному индексу требуется просмотр двух
индексов вместо одного.
CREATE TABLE layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
CREATE TABLE layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
CREATE TABLE layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
CREATE TABLE layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
CREATE TABLE layout_test (
col1 int NOT NULL,
col2 int NOT NULL,
PRIMARY KEY(col1),
KEY(col2)
);
• Записи индекса обычно компактнее полной строки, поэтому, если
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 = ‘HOPPER’G
************************** 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;
СУБД осень 2012 лекция 7

Weitere ähnliche Inhalte

Was ist angesagt?

Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьTanya Denisyuk
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работыPaul Stashevsky
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Ontico
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Roman Brovko
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.Roman Brovko
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь ЧертенковImprove Group
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverSQALab
 
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8DefconRussia
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Python Meetup
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаAlexander Kucherenko
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Roman Brovko
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...it-people
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаYandex
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.Roman Brovko
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.Roman Brovko
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Roman Brovko
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)Evgeny Kaziak
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работыPaul Stashevsky
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.Roman Brovko
 

Was ist angesagt? (20)

Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьСергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
Сергей Аверин, То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
Selenium: начало работы
Selenium: начало работыSelenium: начало работы
Selenium: начало работы
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)Использование хранимых процедур в MySQL (Константин Осипов)
Использование хранимых процедур в MySQL (Константин Осипов)
 
Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.Лекция 12. Быстрее, Python, ещё быстрее.
Лекция 12. Быстрее, Python, ещё быстрее.
 
Лекция 6. Классы 1.
Лекция 6. Классы 1.Лекция 6. Классы 1.
Лекция 6. Классы 1.
 
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
"Истории из жизни опытного iOS разработчика"— Игорь Чертенков
 
Делаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх WebdriverДелаем кроссбраузерные тесты поверх Webdriver
Делаем кроссбраузерные тесты поверх Webdriver
 
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
Nikita Tarakanov - Kernel Pool Overflow from Windows XP to Windows 8
 
Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"Максим Щепелин. "Unittesting. Как?"
Максим Щепелин. "Unittesting. Как?"
 
Поговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языкаПоговорим о JavaScript, основы и современные тенденции развития языка
Поговорим о JavaScript, основы и современные тенденции развития языка
 
Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.Лекция 2. Всё, что вы хотели знать о функциях в Python.
Лекция 2. Всё, что вы хотели знать о функциях в Python.
 
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
Aleksey Yeschenko "Моделирование данных с помощью CQL3". Выступление на Cassa...
 
Objective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантаймаObjective-C 2.0: краткое описание языка и рантайма
Objective-C 2.0: краткое описание языка и рантайма
 
Лекция 11. Тестирование.
Лекция 11. Тестирование.Лекция 11. Тестирование.
Лекция 11. Тестирование.
 
Лекция 10. Классы 2.
Лекция 10. Классы 2.Лекция 10. Классы 2.
Лекция 10. Классы 2.
 
Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.Лекция 9. Модули, пакеты и система импорта.
Лекция 9. Модули, пакеты и система импорта.
 
[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)[JAM 1.1] Clean Code (Paul Malikov)
[JAM 1.1] Clean Code (Paul Malikov)
 
Selenium: приемы работы
Selenium: приемы работыSelenium: приемы работы
Selenium: приемы работы
 
Лекция 8. Итераторы, генераторы и модуль itertools.
 Лекция 8. Итераторы, генераторы и модуль itertools. Лекция 8. Итераторы, генераторы и модуль itertools.
Лекция 8. Итераторы, генераторы и модуль itertools.
 

Andere mochten auch

Проектирование графических интерфейсов лекция 6 - часть 2
Проектирование графических интерфейсов лекция 6 - часть 2Проектирование графических интерфейсов лекция 6 - часть 2
Проектирование графических интерфейсов лекция 6 - часть 2Technopark
 
Android осень 2013 лекция 2
Android осень 2013 лекция 2Android осень 2013 лекция 2
Android осень 2013 лекция 2Technopark
 
Безопасность интернет-приложений осень 2013 лекция 9
Безопасность интернет-приложений осень 2013 лекция 9Безопасность интернет-приложений осень 2013 лекция 9
Безопасность интернет-приложений осень 2013 лекция 9Technopark
 
Highload осень 2012 лекция 2
Highload осень 2012 лекция 2Highload осень 2012 лекция 2
Highload осень 2012 лекция 2Technopark
 
Проектирование графических интерфейсов лекция 9
Проектирование графических интерфейсов лекция 9Проектирование графических интерфейсов лекция 9
Проектирование графических интерфейсов лекция 9Technopark
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4Technopark
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Technopark
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4Technopark
 
Highload осень 2012 лекция 9
Highload осень 2012 лекция 9Highload осень 2012 лекция 9
Highload осень 2012 лекция 9Technopark
 

Andere mochten auch (9)

Проектирование графических интерфейсов лекция 6 - часть 2
Проектирование графических интерфейсов лекция 6 - часть 2Проектирование графических интерфейсов лекция 6 - часть 2
Проектирование графических интерфейсов лекция 6 - часть 2
 
Android осень 2013 лекция 2
Android осень 2013 лекция 2Android осень 2013 лекция 2
Android осень 2013 лекция 2
 
Безопасность интернет-приложений осень 2013 лекция 9
Безопасность интернет-приложений осень 2013 лекция 9Безопасность интернет-приложений осень 2013 лекция 9
Безопасность интернет-приложений осень 2013 лекция 9
 
Highload осень 2012 лекция 2
Highload осень 2012 лекция 2Highload осень 2012 лекция 2
Highload осень 2012 лекция 2
 
Проектирование графических интерфейсов лекция 9
Проектирование графических интерфейсов лекция 9Проектирование графических интерфейсов лекция 9
Проектирование графических интерфейсов лекция 9
 
Android осень 2013 лекция 4
Android осень 2013 лекция 4Android осень 2013 лекция 4
Android осень 2013 лекция 4
 
Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1Frontend весна 2014 лекция 1
Frontend весна 2014 лекция 1
 
Web весна 2012 лекция 4
Web весна 2012 лекция 4Web весна 2012 лекция 4
Web весна 2012 лекция 4
 
Highload осень 2012 лекция 9
Highload осень 2012 лекция 9Highload осень 2012 лекция 9
Highload осень 2012 лекция 9
 

Ähnlich wie СУБД осень 2012 лекция 7

СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...Technopark
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"Technopark
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"Technopark
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8Technopark
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Ontico
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовAlex.Kolonitsky
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaSveta Smirnova
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLNikolay Pisarev
 
работа с базами данных с использованием субд My sql
работа с базами данных с использованием субд My sqlработа с базами данных с использованием субд My sql
работа с базами данных с использованием субд My sqlSai_17
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглитьSergey Xek
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. RussianRawan Qurmet
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEBAlexandre Kalendarev
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Mail.ru Group
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.Sergey Petrunya
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsTroubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsSveta Smirnova
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)AvitoTech
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandraodnoklassniki.ru
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubyAlexey Nayden
 

Ähnlich wie СУБД осень 2012 лекция 7 (20)

СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
СУБД 2013 Лекция №6 "Профилирование запросов. Сложноструктурированные SQL-зап...
 
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
СУБД 2013 Лекция №7 "Оптимизация запросов и индексирование"
 
СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"СУБД 2013 Лекция №5 "Определение узких мест"
СУБД 2013 Лекция №5 "Определение узких мест"
 
СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8СУБД осень 2012 лекция 8
СУБД осень 2012 лекция 8
 
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
Основы индексирования и расширенные возможности EXPLAIN в MySQL / Василий Лук...
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
 
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения PerconaСовременному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
Современному хайлоду - современные решения: MySQL 8.0 и улучшения Percona
 
Народные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQLНародные средства оптимизации PostgreSQL
Народные средства оптимизации PostgreSQL
 
работа с базами данных с использованием субд My sql
работа с базами данных с использованием субд My sqlработа с базами данных с использованием субд My sql
работа с базами данных с использованием субд My sql
 
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 То, что вы хотели знать о HandlerSocket, но не смогли нагуглить То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
То, что вы хотели знать о HandlerSocket, но не смогли нагуглить
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Использование Sedna в WEB
Использование Sedna в WEBИспользование Sedna в WEB
Использование Sedna в WEB
 
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
Павел Лузанов, Postgres Professional. «PostgreSQL для пользователей Oracle»
 
MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.MariaDB 10.1 - что нового.
MariaDB 10.1 - что нового.
 
Troubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addonsTroubleshooting my sql_performance_addons
Troubleshooting my sql_performance_addons
 
"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)"Деплой кода процедур" Мурат Кабилов (Avito)
"Деплой кода процедур" Мурат Кабилов (Avito)
 
За гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на CassandraЗа гранью NoSQL: NewSQL на Cassandra
За гранью NoSQL: NewSQL на Cassandra
 
Sequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на RubySequel — механизм доступа к БД, написанный на Ruby
Sequel — механизм доступа к БД, написанный на Ruby
 

Mehr von Technopark

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelTechnopark
 
Лекция 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
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"Technopark
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"Technopark
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...Technopark
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"Technopark
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"Technopark
 

Mehr von Technopark (20)

Лекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель PregelЛекция 11. Вычислительная модель Pregel
Лекция 11. Вычислительная модель Pregel
 
Лекция 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" Час...
 
СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"СУБД 2013 Лекция №9 "Безопасность баз данных"
СУБД 2013 Лекция №9 "Безопасность баз данных"
 
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"СУБД 2013 Лекция №8 "Конфигурирование базы данных"
СУБД 2013 Лекция №8 "Конфигурирование базы данных"
 
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
СУБД 2013 Лекция №4 "Расширенные возможности работы с базами данных. Триггеры...
 
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
СУБД 2013 Лекция №3 "Выборка данных (продолжение). Транзакции"
 
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
СУБД 2013 Лекция №2 "Модификация данных. Выборка данных (начало)"
 

СУБД осень 2012 лекция 7

  • 1.
  • 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. SHOW STATUS Bytes_received и Bytes_sent Количество байтов, соответственно полученных и отправленных сервером. Com_* Команды, которые сервер выполняет Created_* Временные таблицы и файлы, созданные во время выполнения запроса Handler_* Операции подсистемы хранения Select_* Различные типы планов выполнения операции соединения Sort_* Разнообразная информация о сортировке
  • 7. 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 …
  • 8. • EXPLAIN ничего не говорит о том, как влияют на запрос триггеры, хранимые и пользовательские (UDF) функции. • Она не работает с хранимыми процедурами, хотя можно разложить процедуру на отдельные запросы и вызвать EXPLAIN для каждого из них. • Она ничего не говорит об оптимизациях, которые MySQL производит уже на этапе выполнения запроса. • Часть отображаемой статистической информации – всего лишь оценка, иногда очень неточная. • Она не показывает все, что можно было бы сообщить о плане выполнения запроса • Она не делает различий между некоторыми операциями, называя их одинаково.
  • 9. EXPLAIN SELECT (SELECT 1 FROM sakila.actor LIMIT 1) FROM sakila.film id select_type table 1PRIMARY film 2SUBQUERY actor EXPLAIN SELECT film_id FROM (SELECT film_id FROM sakila.film) AS der; id select_type table 1PRIMARY <derived2> 2DERIVED film EXPLAIN SELECT 1 UNION ALL SELECT 1; id select_type table 1PRIMARY NULL 2UNION NULL NULL UNION RESULT <union1,2>
  • 10. PRIMARY Самый внешний запрос SUBQUERY Запрос SELECT, который содержится в подзапросе, находящемся во фразе SELECT (иными словами, не во фразе FROM DERIVED Значение DERIVED означает, что данный запрос SELECT является подзапросом во фразе FROM. UNION Второй и последующий запросы SELECT, входящие в объединение UNION, помечаются признаком UNION. UNION RESULT Запрос SELECT, применяемый для выборки результатов из временной таблицы, созданной в ходе выполнения UNION.
  • 11. EXPLAIN SELECT film.film_id FROM sakila.film INNER JOIN sakila.film_actor USING(film_id) INNER JOIN sakila.actor USING(actor_id); id select_type table 1SIMPLE actor 1SIMPLE film_actor 1SIMPLE film
  • 12. EXPLAIN SELECT actor_id, (SELECT 1 FROM sakila.film_actor WHERE film_actor.actor_id = der_1.actor_id LIMIT 1) FROM ( SELECT actor_id FROM sakila.actor LIMIT 5 ) AS der_1 UNION ALL SELECT film_id, (SELECT @var1 FROM sakila.rental LIMIT 1) FROM ( SELECT film_id, (SELECT 1 FROM sakila.store LIMIT 1) FROM sakila.film LIMIT 5 ) AS der_2; id select_type table 1PRIMARY <derived3> 3DERIVED actor 2DEPENDENT SUBQUERY film_actor 4UNION <derived6> 6DERIVED film 7SUBQUERY store 5UNCACHEABLE SUBQUERY rental NULL UNION RESULT <union1,4>
  • 13. ALL Этот подход обычно называют сканированием таблицы. index То же, что сканирование таблицы, только MySQL просматривает ее в порядке, задаваемом индексом, а не в порядке следования строк. range Просмотр диапазона – это ограниченная форма сканирования индекса. Просмотр начинается в определенной точке индекса и возвращает строки в некотором диапазоне значений. ref Это доступ по индексу (иногда он называется поиском по индексу (index lookup)), в результате которого возвращаются строки, соответствующие единственному заданному значению. eq_ref Это поиск по индексу в случае, когда MySQL точно знает, что будет возвращено не более одного значения. const, system Эти типы доступа MySQL применяет, когда в процессе оптимизации какую-то часть запроса можно преобразовать в константу. NULL Этот метод означает, что MySQL сумела разрешить запрос на фазе оптимизации, так что в ходе выполнения вообще не потребуется обращаться к таблице или индексу.
  • 14. EXPLAIN SELECT actor_id, film_id FROM sakila.film_actorG ************************* 1. row ************************* id: 1 select_type: SIMPLE table: film_actor type: index possible_keys: NULL key: idx_fk_film_id key_len: 2 ref: NULL rows: 5143 Extra: Using index
  • 15. EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4; ...| type | possible_keys | key | key_len |... ...| ref | PRIMARY | PRIMARY | 2 |...
  • 16. EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4; ...| type | possible_keys | key | key_len |... ...| ref | PRIMARY | PRIMARY | 2 |... CREATE TABLE t ( a char(3) NOT NULL, b int(11) NOT NULL, c char(1) NOT NULL, PRIMARY KEY (a,b,c) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; EXPLAIN SELECT a FROM t WHERE a=’sak’ AND b = 112;
  • 17. EXPLAIN SELECT actor_id, film_id FROM sakila.film_actor WHERE actor_id=4; ...| type | possible_keys | key | key_len |... ...| ref | PRIMARY | PRIMARY | 2 |... CREATE TABLE t ( a char(3) NOT NULL, b int(11) NOT NULL, c char(1) NOT NULL, PRIMARY KEY (a,b,c) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 ; EXPLAIN SELECT a FROM t WHERE a=’sak’ AND b = 112; ... |type | possible_keys | key | key_len |... ... | ref | PRIMARY | PRIMARY | 13 |...
  • 18. EXPLAIN SELECT STRAIGHT_JOIN f.film_id FROM sakila.film AS f INNER JOIN sakila.film_actor AS fa ON f.film_id=fa.film_id AND fa.actor_id = 1 INNER JOIN sakila.actor AS a USING(actor_id); ...| table |...| key | key_len | ref |... ...| a |...| PRIMARY | 2 | const |... ...| f |...| idx_fk_language_id | 1 | NULL |... ...| fa |...| PRIMARY | 4 | const,sakila.f.film_id |...
  • 19. EXPLAIN SELECT f.film_id FROM sakila.film AS f INNER JOIN sakila.film_actor AS fa USING(film_id) INNER JOIN sakila.actor AS a USING(actor_id); ...| rows |... ...| 200 |... ...| 13 |... ...| 1 |...
  • 20. Using index Означает, что MySQL воспользуется покрывающим индексом, чтобы избежать доступа к самой таблице. Using where Означает, что сервер произведет дополнительную фильтрацию строк, отобранных подсистемой хранения. Using temporary Означает, что MySQL будет применять временную таблицу для сортировки результатов запроса. Using filesort Означает, что MySQL прибегнет к обычной сортировке для упорядочения результатов, а не станет читать строки из таблицы в порядке, задаваемом индексом. range checked for each record Означает, что подходящего индекса не нашлось, поэтому сервер будет заново искать индекс при обработке каждой строки в операции соединения.
  • 21. UPDATE sakila.actor INNER JOIN sakila.film_actor USING (actor_id) SET actor.last_update=film_actor.last_update;
  • 22. 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
  • 23. 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:
  • 24. SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
  • 25. 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);
  • 26. 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);
  • 27.
  • 28. • Вы можете хранить связанные данные рядом. • Быстрый доступ к данным. Кластерный индекс хранит и индекс, и данные вместе в одной B-Tree структуре, поэтому извлечение строк из кластерного индекса обычно происходит быстрее, чем сопоставимый поиск в некластерном индексе. • Использующие покрывающие индексы запросы могут получить значение первичного ключа из листового узла.
  • 29. • Если данные помещаются в памяти, то порядок доступа к ним не имеет значения, и тогда кластерные индексы не принесут большой пользы. • Если вы загружаете большое количество данных в другом порядке, то по окончании загрузки имеет смысл реорганизовать таблицу с помощью команды OPTIMIZE TABLE. • Обновление столбцов кластерного индекса обходится дорого, поскольку InnoDB вынуждена перемещать каждую обновленную строку в новое место. • Для таблиц с кластерным индексом вставка новых строк или обновление первичного ключа, требующее перемещения строки, может приводить к расщеплению страницы. • Полное сканирование кластерных таблиц может оказаться более медленным, особенно если строки упакованы менее плотно или хранятся непоследовательно из-за расщепления страниц. • Вторичные (некластерные) индексы могут оказаться больше, чем вы ожидаете, поскольку в листовых узлах хранятся значения столбцов, составляющих первичный ключ. • Для доступа к данным по вторичному индексу требуется просмотр двух индексов вместо одного.
  • 30. CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 31. CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 32. CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 33. CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 34. CREATE TABLE layout_test ( col1 int NOT NULL, col2 int NOT NULL, PRIMARY KEY(col1), KEY(col2) );
  • 35.
  • 36. • Записи индекса обычно компактнее полной строки, поэтому, если MySQL читает только индекс, то обращается к значительно меньшему объему данных. • Индексы отсортированы по индексируемым значениям (по крайней мере, внутри страницы), поэтому для поиска по диапазону, характеризуемому большим объемом ввода/вывода, потребуется меньше операций обращения к диску. • Большинство подсистем хранения кэширует индексы лучше, чем сами данные. • Покрывающие индексы особенно полезны в случае таблиц InnoDB из-за кластерных индексов. Вторичные индексы InnoDB хранят значения первичного ключа строки в листовых узлах. Таким образом, вторичный индекс, который «покрывает» запрос, позволяет избежать еще одного поиска по первичному индексу.
  • 37. 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
  • 38. EXPLAIN SELECT actor_id, last_name FROM sakila.actor WHERE last_name = ‘HOPPER’G ************************** 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
  • 39. 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
  • 40. 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;
  • 41. 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;
  • 42. 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;
  • 43. 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;
  • 44. 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;
  • 45. 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;
  • 46. • Нормализованные таблицы обычно обновляются быстрее, чем ненормализованные. • Когда данные хорошо нормализованы, они либо редко дублируются, либо не дублируются совсем. Так что изменять приходится меньше данных. • Нормализованные таблицы обычно меньше по размеру, поэтому лучше помещаются в памяти и их производительность выше. • Из-за отсутствия избыточных данных реже возникает необходимость в запросах с фразами DISTINCT или GROUP BY для извлечения списков значений.
  • 47. • Все данные находятся в одной и той же таблице, что позволяет избежать соединений. • Более эффективные стратегии индексирования 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;
  • 48. Таблицы счетчиков CREATE TABLE hit_counter ( cnt int unsigned not null ) ENGINE=InnoDB; UPDATE hit_counter SET cnt = cnt + 1;
  • 49. Таблицы счетчиков 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;
  • 50. Таблицы счетчиков 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;