Оптимизация mysql. Что должен знать каждый разработчик

89
MySQL: Основы оптимизации или Что должен знать каждый разработчик

Upload: agnislav-onufrijchuk

Post on 07-Dec-2014

2.842 views

Category:

Technology


2 download

DESCRIPTION

 

TRANSCRIPT

Page 1: Оптимизация MySQL. Что должен знать каждый разработчик

MySQL:Основы оптимизации

илиЧто должен знать каждый

разработчик

Page 2: Оптимизация MySQL. Что должен знать каждый разработчик

Агнислав Онуфрийчук

Обо мне

Page 3: Оптимизация MySQL. Что должен знать каждый разработчик

Агнислав Онуфрийчук Веб-разработчик

Обо мне

Page 4: Оптимизация MySQL. Что должен знать каждый разработчик

Агнислав Онуфрийчук Веб-разработчик Люблю девушек

Обо мне

Page 5: Оптимизация MySQL. Что должен знать каждый разработчик

Агнислав Онуфрийчук Веб-разработчик Люблю девушек Не люблю MS Internet Exporer и Opera

Обо мне

Page 6: Оптимизация MySQL. Что должен знать каждый разработчик

Кто работает с MySQL?

О вас

Page 7: Оптимизация MySQL. Что должен знать каждый разработчик

Кто работает с MySQL? Кто использует MyISAM?

О вас

Page 8: Оптимизация MySQL. Что должен знать каждый разработчик

Кто работает с MySQL? Кто использует MyISAM? Кто ещё не использует InnoDB?

О вас

Page 9: Оптимизация MySQL. Что должен знать каждый разработчик

Кто работает с MySQL? Кто использует MyISAM? Кто ещё не использует InnoDB? Кто не знает про my.ini/my.cnf?

О вас

Page 10: Оптимизация MySQL. Что должен знать каждый разработчик

Здесь знают толк в оптимизации MySQL

О PortaOne

Page 11: Оптимизация MySQL. Что должен знать каждый разработчик

Здесь знают толк в оптимизации MySQL Здесь знают толк в девушках

О PortaOne

Page 12: Оптимизация MySQL. Что должен знать каждый разработчик

Здесь знают толк в оптимизации MySQL Здесь знают толк в девушках Здесь знают толк в программистах

О PortaOne

Page 13: Оптимизация MySQL. Что должен знать каждый разработчик

Здесь знают толк в оптимизации MySQL Здесь знают толк в девушках Здесь знают толк в программистах Здесь знают толк в after-parties.

О PortaOne

Page 14: Оптимизация MySQL. Что должен знать каждый разработчик

Здесь знают толк в оптимизации MySQL Здесь знают толк в девушках Здесь знают толк в программистах Здесь знают толк в after-parties.

О PortaOne

Page 15: Оптимизация MySQL. Что должен знать каждый разработчик

Начнём?

Page 16: Оптимизация MySQL. Что должен знать каждый разработчик

Оптимизация MySQL

Page 17: Оптимизация MySQL. Что должен знать каждый разработчик

Всё плохо.

Оптимизация MySQL

Page 18: Оптимизация MySQL. Что должен знать каждый разработчик

Сегодня мы не поговорим о…

Page 19: Оптимизация MySQL. Что должен знать каждый разработчик

Шардинге

Сегодня мы не поговорим о…

Page 20: Оптимизация MySQL. Что должен знать каждый разработчик

Шардинге Железе

Сегодня мы не поговорим о…

Page 21: Оптимизация MySQL. Что должен знать каждый разработчик

Шардинге Железе Операционных системах

Сегодня мы не поговорим о…

Page 22: Оптимизация MySQL. Что должен знать каждый разработчик

Шардинге Железе Операционных системах Файловых системах

Сегодня мы не поговорим о…

Page 23: Оптимизация MySQL. Что должен знать каждый разработчик

Сегодня мы поговорим о…

Page 24: Оптимизация MySQL. Что должен знать каждый разработчик

Движках (engines)

Сегодня мы поговорим о…

Page 25: Оптимизация MySQL. Что должен знать каждый разработчик

Движках (engines) Базовых настройках

Сегодня мы поговорим о…

Page 26: Оптимизация MySQL. Что должен знать каждый разработчик

Движках (engines) Базовых настройках Полезных утилитах

Сегодня мы поговорим о…

Page 27: Оптимизация MySQL. Что должен знать каждый разработчик

Движках (engines) Базовых настройках Полезных утилитах Запросах

Сегодня мы поговорим о…

Page 28: Оптимизация MySQL. Что должен знать каждый разработчик

Движках (engines) Базовых настройках Полезных утилитах Запросах И о чём-нибудь приятном

Сегодня мы поговорим о…

Page 29: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries Girls

Roadmap

Page 30: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries Girls

Roadmap

Page 31: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 32: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 33: Оптимизация MySQL. Что должен знать каждый разработчик

Engines

Page 34: Оптимизация MySQL. Что должен знать каждый разработчик

WTF?

Engines

Page 35: Оптимизация MySQL. Что должен знать каждый разработчик

WTF? It’s cool!

Engines

Page 36: Оптимизация MySQL. Что должен знать каждый разработчик

InnoDB/XtraDB MyISAM/Maria Memory NDB CSV Blackhole

Engines

Page 37: Оптимизация MySQL. Что должен знать каждый разработчик

Extremely fast Not-transactional Table-level locking No BLOB/TEXT data types

Engines: Memory

Page 38: Оптимизация MySQL. Что должен знать каждый разработчик

Extremely fast Transactional Row-level locking Good scaling

capabilities

Engines: NDB

Page 39: Оптимизация MySQL. Что должен знать каждый разработчик

Simple data exchange

No table partitioning No NULL values

(since 5.1.23)

Engines: CSV

Page 40: Оптимизация MySQL. Что должен знать каждый разработчик

Extremely fast (faster then Memory/NDB) Transactional All types of indexes Low-cost storage

Engines: Blackhole

Page 41: Оптимизация MySQL. Что должен знать каждый разработчик

Default for years (up to 5.5) Non-Transactional Table-level locking Full-text search indexes Fast read

Engines: MyISAM

Page 42: Оптимизация MySQL. Что должен знать каждый разработчик

Transactional Row-level locking Foreign keys Simple performance tuning

Engines: InnoDB

Page 43: Оптимизация MySQL. Что должен знать каждый разработчик

All InnoDB feature plus: “Out-of-box” better performance Most powerful performance tuning “Troubleshoot without guesswork”

Engines: XtraDB

Page 44: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 45: Оптимизация MySQL. Что должен знать каждый разработчик

There hundreds of them…

Settings

Page 46: Оптимизация MySQL. Что должен знать каждый разработчик

There hundreds of them… but a couple of them are enough for us

Settings

Page 47: Оптимизация MySQL. Что должен знать каждый разработчик

Using memory is better than using disk

The main point is…

Page 48: Оптимизация MySQL. Что должен знать каждый разработчик

query_cache_size

Does matter for SELECT-dedicated server

32M is generally enough

Settings

Page 49: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_buffer_pool_size

Give all you can:

Servers: 50-75% of available memoryDev PC: 25-50% of available memory

Settings

Page 50: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_log_file_size

Make your log files big.

128M/256M is a good value

Settings

Page 51: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_log_buffer_size

How often we’ll flush log data to disk

4M is a good value unless you’re piping large blobs.

Settings

Page 52: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_flush_log_at_trx_commit

0 – write log buffer to file and flush it to disk every second

1 – write&flush to disk for every transaction

2 – write for every transaction and flush every second

Settings

Page 53: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_thread_concurrency=8

Just use this value

Settings

Page 54: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_flush_method=O_DIRECT

Avoid double buffering

Settings

Page 55: Оптимизация MySQL. Что должен знать каждый разработчик

innodb_file_per_table

Use it if you don’t have tons of tables

Settings

Page 56: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 57: Оптимизация MySQL. Что должен знать каждый разработчик

tuning-primer.sh mysql-tuner.pl maatkit innotop

Utilities

Page 58: Оптимизация MySQL. Что должен знать каждый разработчик

http://www.day32.com/MySQL/

tuning-primer.sh

Page 59: Оптимизация MySQL. Что должен знать каждый разработчик

SLOW QUERIES

Current long_query_time = 10 sec.

You have 526 out of 36204146 that take longer than 10 sec. to complete

The slow query log is NOT enabled.

Your long_query_time may be too high, I typically set this under 5 sec.

tuning-primer.sh

Page 60: Оптимизация MySQL. Что должен знать каждый разработчик

QUERY CACHEQuery cache is enabledCurrent query_cache_size = 8 MCurrent query_cache_used = 7 MCurrent query_cach_limit = 1 MCurrent Query cache fill ratio = 89.38 %However, 254246 queries have been removed from the query cache due to lack of memoryPerhaps you should raise query_cache_sizeMySQL won't cache query results that are larger than query_cache_limit in size 

tuning-primer.sh

Page 61: Оптимизация MySQL. Что должен знать каждый разработчик

TEMP TABLES

Current max_heap_table_size = 16 M

Current tmp_table_size = 32 M

Of 35170 temp tables, 74% were created on disk

Effective in-memory tmp_table_size is limited to max_heap_table_size.

Perhaps you should increase your tmp_table_size and/or max_heap_table_size to reduce the number of disk-based temporary tables

Note! BLOB and TEXT columns are not allow in memory tables.

If you are using these columns raising these values might not impact your ratio of on disk temp tables.

tuning-primer.sh

Page 62: Оптимизация MySQL. Что должен знать каждый разработчик

http://mysql-tuner.pl

mysql-tuner.pl

Page 63: Оптимизация MySQL. Что должен знать каждый разработчик

-------- Storage Engine Statistics ---------------------

[--] Status: -Archive +BDB -Federated +InnoDB -ISAM -NDBCluster

[--] Data in MyISAM tables: 19M (Tables: 90)

[!!] InnoDB is enabled but isn't being used

[!!] BDB is enabled but isn't being used

[!!] Total fragmented tables: 18

mysql-tuner.pl

Page 64: Оптимизация MySQL. Что должен знать каждый разработчик

-------- Performance Metrics ---------------------------

[--] Up for: 16m 37s (6K q [6.059 qps], 146 conn, TX: 54M, RX: 665K)

[--] Reads / Writes: 62% / 38%

[--] Total buffers: 298.0M global + 6.3M per thread (100 max threads)

[OK] Maximum possible memory usage: 929.2M (26% of installed RAM)

[OK] Slow queries: 0% (0/6K)

[OK] Highest usage of available connections: 5% (5/100)

[OK] Key buffer size / total MyISAM indexes: 256.0M/2.3M

[!!] Key buffer hit rate: 91.3% (1K cached / 101 reads)

[OK] Query cache efficiency: 97.6% (5K cached / 5K selects)

mysql-tuner.pl

Page 65: Оптимизация MySQL. Что должен знать каждый разработчик

-------- Recommendations -------------------------------

General recommendations:

Add skip-innodb to MySQL configuration to disable InnoDB

Add skip-bdb to MySQL configuration to disable BDB

Run OPTIMIZE TABLE to defragment tables for better performance

MySQL started within last 24 hours - recommendations may be inaccurate

Enable the slow query log to troubleshoot bad queries

mysql-tuner.pl

Page 66: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit http://www.maatkit.org/

Page 67: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit mk-error-log mk-log-player mk-index-usage mk-query-advisor mk-query-digest mk-query-profiler … (>30)

Page 68: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-error-log Count Level Message

===== ======= =======================================

5 info mysqld started

4 info mysqld version info

3 info InnoDB: Started

2 info mysqld ended

1 unknown Number of processes running now: 0

1 error [ERROR] /usr/sbin/mysqld: unknown variable 'ssl-ke

1 error [ERROR] Failed to initialize the master info struc

Page 69: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-log-playermk-log-player does two things: it splits MySQL query logs into session files and it plays (executes) queries in session files on a MySQL server.

Page 70: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-index-usageThis tool connects to a MySQL database server, reads through a query log, and uses EXPLAIN to ask MySQL how it will use each query. When it is finished, it prints out a report on indexes that the queries didn't use.

Page 71: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-query-advisormk-query-advisor examines queries and applies rules to them, trying to find queries that look bad according to the rules. It reports on queries that match the rules, so you can find bad practices or hidden problems in your SQL.

Page 72: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-query-digest # pct total min max avg 95% stddev median

# Count 0 2

# Exec time 13 1105s 552s 554s 553s 554s 2s 553s

# Lock time 0 216us 99us 117us 108us 117us 12us 108us

# Rows sent 20 6.26M 3.13M 3.13M 3.13M 3.13M 12.73 3.13M

# Rows exam 0 6.26M 3.13M 3.13M 3.13M 3.13M 12.73 3.13M

# Query_time distribution

# 1us

# 10us

# 100us

# 1ms

# 10ms

# 100ms

# 1s

# 10s+ #############################################################

Page 73: Оптимизация MySQL. Что должен знать каждый разработчик

maatkit: mk-query-profilermk-query-profiler reads a file containing one or more SQL statements or shell commands, executes them, and analyzes the output of SHOW STATUS afterwards. It then prints statistics about how the batch performed. For example, it can show how many table scans the batch caused, how many page reads, how many temporary tables, and so forth.

Page 74: Оптимизация MySQL. Что должен знать каждый разработчик

http://code.google.com/p/innotop/

innotop

Page 75: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 76: Оптимизация MySQL. Что должен знать каждый разработчик

Queries

Page 77: Оптимизация MySQL. Что должен знать каждый разработчик

use ORMs use Indexes be concrete (limit yourself) get a map!

Queries

Page 78: Оптимизация MySQL. Что должен знать каждый разработчик

why?

use ORMs

Page 79: Оптимизация MySQL. Что должен знать каждый разработчик

experience safety clear code speeding development portability

use ORMs

Page 80: Оптимизация MySQL. Что должен знать каждый разработчик

why?

use Indexes

Page 81: Оптимизация MySQL. Что должен знать каждый разработчик

CREATE TABLE employee ( employee_number char(10) NOT NULL, firstname varchar(40), surname varchar(40), address text, tel_no varchar(25), salary int(11), overtime_rate int(10) NOT NULL);

use Indexes

Page 82: Оптимизация MySQL. Что должен знать каждый разработчик

use Indexes

NOT using PRIMARY KEY Using PRIMARY KEY

id: 1

select_type: SIMPLE

table: employee

type: ALL

possible_keys: NULL

key: NULL

key_len: NULL

ref: NULL

rows: 10000

Extra: Using where

id: 1

select_type: SIMPLE

table: employee

type: const

possible_keys: PRIMARY

key: PRIMARY

key_len: 4

ref: const

rows: 1

Extra:

EXPLAIN SELECT employee_number, firstname, surname FROM employee WHERE id=1000\G

Page 83: Оптимизация MySQL. Что должен знать каждый разработчик

use IndexesALTER TABLE employee ADD INDEX(surname, firstname);

SELECT overtime_rate FROM employeeWHERE surname='Madida';

SELECT overtime_rate FROM employee WHERE firstname='Mpho';

SELECT overtime_rate FROM employee WHERE surname='Madida' and firstname="Mpho";

SELECT overtime_rate FROM employee WHERE firstname="Mpho" and surname='Madida';

Page 84: Оптимизация MySQL. Что должен знать каждый разработчик

use IndexesALTER TABLE employee ADD INDEX(surname, firstname);

SELECT overtime_rate FROM employeeWHERE surname='Madida';

SELECT overtime_rate FROM employee WHERE firstname='Mpho';

SELECT overtime_rate FROM employee WHERE surname='Madida' and firstname="Mpho";

SELECT overtime_rate FROM employee WHERE firstname="Mpho" and surname='Madida';

Page 85: Оптимизация MySQL. Что должен знать каждый разработчик

use Indexes and be concreteselect … WHERE year(my_date) > 2010select … where email LIKE “%@gmail.com”select * from table;select * from table limit 10000;select col1 from table where id > 0;

insert into table values(‘1’, ‘bla’);

Page 86: Оптимизация MySQL. Что должен знать каждый разработчик

create table `ids` ( `id` int(11) NOT NULL AUTO_INCREMENT, `id1` int(11) NOT NULL, `id2` int(11) DEFAULT NULL, …, PRIMARY KEY (`id`) ) ENGINE=InnoDB;

SELECT COUNT(*) FROM `ids`; SELECT COUNT(`id`) FROM `ids`; SELECT COUNT(`id1`) FROM `ids`; SELECT COUNT(`id2`) FROM `ids`;

get a map!

Page 87: Оптимизация MySQL. Что должен знать каждый разработчик

Engines Settings Utilities Queries

Roadmap

Page 88: Оптимизация MySQL. Что должен знать каждый разработчик

Questions?

Page 89: Оптимизация MySQL. Что должен знать каждый разработчик

Contacts

vcard agnislav @

gmailskypetwitter

facebookvkontaktelivejournal