SlideShare a Scribd company logo
MySQL Query Optimization


      2010.07.09 Cai Baohua
Agenda
• What the query optimizer is
• The principles of the optimization
• Explain and Profiling
• Use Index
• JOIN Optimization
• ORDER BY, GROUP BY Optimization
MySQL Query Optimizer
MySQl Query Optimizer

               Parser


              Table          Table
Optimizer   Modification   Maintenance   .....
             Module         Module

              Access
              Control
              Module
MySQl Query Optimizer


• Not only CBO but aslo CBO + RBO
 • Cost Base Optimizer
 • Rule Base Optimizer
The Principles Of the
   Optimization
Mysql query optimization
•   Optimizing the query which need more optimization
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Always using the small result set to drive the large result set
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Always using the small result set to drive the large result set
•   Complete the sequencing in the index as much as possible
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Always using the small result set to drive the large result set
•   Complete the sequencing in the index as much as possible
•   Fetch the only fields that we need
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Always using the small result set to drive the large result set
•   Complete the sequencing in the index as much as possible
•   Fetch the only fields that we need
•   Only use the most effective conditions of the filter
•   Optimizing the query which need more optimization
•   Identify the performance bottleneck
•   Find clear optimization objects
•   Start with Explain and use Profile more often
•   Always using the small result set to drive the large result set
•   Complete the sequencing in the index as much as possible
•   Fetch the only fields that we need
•   Only use the most effective conditions of the filter
•   Avoid the complex Join and sub queries as far as possible
Explain and Profiling
Use Explain and Profiling
Explain tells you:
•   In which order the tables are read
•   What types of read operations that are made
•   Which indexes could have been used
•   Which indexes are used
•   How the tables refer to each other
•   How many rows the optimizer estimates to retrieve
    from each table
Use Explain and Profiling
Use Explain and Profiling
Explain Types
Different join types.

system                  !"#$%&'(#$"&)$*+(,$*+#$-*.$
const                   /%$%"#$0*)%$*+#$0&%1"2+3$-*.4$%-#&%#5$&)$&$
                        1*+)%&+%$
eq_ref                  6+#$-*.$7#-$-*.$8-*0$7-#92*:)$%&'(#)$
ref                     ;#9#-&($-*.)$.2%"$0&%1"2+3$2+5#<$9&(:#$
ref_or_null             =2>#$-#84$7(:)$?@==$9&(:#)$
index_merge             ;#9#-&($2+5#<$)#&-1"#)$&-#$0#-3#5$
unique_subquery         ;&0#$&)$-#8$8*-$)*0#$):'A:#-2#)$
index_subquery          /)$&'*9#$8*-$+*+B:+2A:#$2+5#<#)$
range                   /$-&+3#$2+5#<$)1&+$
index                   !"#$."*(#$2+5#<$2)$)1&++#5$
ALL                     /$8:(($%&'(#$)1&+$
Use Explain and Profiling
Explain Types
Different join types.

system                  !"#$%&'(#$"&)$*+(,$*+#$-*.$                   good
const                   /%$%"#$0*)%$*+#$0&%1"2+3$-*.4$%-#&%#5$&)$&$
                        1*+)%&+%$
eq_ref                  6+#$-*.$7#-$-*.$8-*0$7-#92*:)$%&'(#)$
ref                     ;#9#-&($-*.)$.2%"$0&%1"2+3$2+5#<$9&(:#$
ref_or_null             =2>#$-#84$7(:)$?@==$9&(:#)$
index_merge             ;#9#-&($2+5#<$)#&-1"#)$&-#$0#-3#5$
unique_subquery         ;&0#$&)$-#8$8*-$)*0#$):'A:#-2#)$
index_subquery          /)$&'*9#$8*-$+*+B:+2A:#$2+5#<#)$
range                   /$-&+3#$2+5#<$)1&+$
index                   !"#$."*(#$2+5#<$2)$)1&++#5$
ALL                     /$8:(($%&'(#$)1&+$
                                                                      bad
Use Explain and Profiling
Explain Extra
This column contains additional information about how MySQL resolves the query.


Using index                      !"#$%#&'()$*&$+%#,)#-$&)%,*.")$/%01$)"#$*2-#3$

Using where                      40)$,(($%05&$,%#$'&#-$*2$)"#$%#&'()$

Distinct                         62(7$,$&*2.(#$%05$*&$%#,-$8#%$%05$+019*2,:02$
Not exists                       ;$LEFT JOIN$1*&&*2.$%05&$08:1*<,:02$*&$'&#-$

Using filesort                   ;2$#3)%,$%05$&0%:2.$&)#8$*&$-02#$

Using temporary                  ;$)#180%,%7$),9(#$*&$'&#-$

Range checked                    !"#$%#,-$)78#$*&$08:1*<#-$*2-*=*-',((7$/0%$#,+"$
for each record                  +019*2,:02$0/$%05&$/%01$)"#$8%#=*0'&$),9(#&$
Use Explain and Profiling


• Open / Close Query Profiler
     mysql> set profiling = 1 (close: 0)
Use Explain and Profiling
Show profiles
Use Explain and Profiling
 SHOW PROFILE
• ALL - displays all information
• BLOCK IO - displays counts for block input and output operations
• CONTEXT SWITCHES - displays counts for voluntary and involuntary context switches
• IPC - displays counts for messages sent and received
• MEMORY - is not currently implemented
• PAGE FAULTS - displays counts for major and minor page faults
• SOURCE - displays the names of functions from the source code, together with the name and line
  number of the file in which the function occurs
• SWAPS - displays swap count
Use Explain and Profiling
Show more info
Use Index
Index Types
Index Types
•   Balance-Tree
    •   Primary Key
    •   Secondary Index
    •   InnoDB, MyISAM often use
Index Types
•   Balance-Tree
    •   Primary Key
    •   Secondary Index
    •   InnoDB, MyISAM often use
•   Hash
    •   Memory, NDB Cluster
    •   “=”, “IN”, “<=>” not > < between != like
    •   not work for ORDER BY
Index Types
•   Balance-Tree
    •   Primary Key
    •   Secondary Index
    •   InnoDB, MyISAM often use
•   Hash
    •   Memory, NDB Cluster
    •   “=”, “IN”, “<=>” not > < between != like
    •   not work for ORDER BY
•   Fulltext
    •   CHAR,VARCHAR and TEXT
    •   Uses it instead of LIKE ‘%*****%’, more efficient
Index Types
•   Balance-Tree
    •   Primary Key
    •   Secondary Index
    •   InnoDB, MyISAM often use
•   Hash
    •   Memory, NDB Cluster
    •   “=”, “IN”, “<=>” not > < between != like
    •   not work for ORDER BY
•   Fulltext
    •   CHAR,VARCHAR and TEXT
    •   Uses it instead of LIKE ‘%*****%’, more efficient
•   R-Tree
    •   to solve the problem of spatial data retrieval
    •   only data type: GEOMETRY
Pros and Cons of Index
Pros and Cons of Index
•   Pros
    •   Improve the efficiency of data retrieval
    •   Reduce the cost of database I/O
    •   Reduce the cost of data sorting
Pros and Cons of Index
•   Pros
    •   Improve the efficiency of data retrieval
    •   Reduce the cost of database I/O
    •   Reduce the cost of data sorting
•   Cons
    •   index will take more disk space
    •   slow the speed of updating table (insert, update,
        delete)
When Use Index?
When Use Index?
•   Field used in WHERE more frequently, use
    index
When Use Index?
•   Field used in WHERE more frequently, use
    index
•   Field like status or type, no index
When Use Index?
•   Field used in WHERE more frequently, use
    index
•   Field like status or type, no index
    •   Contain too many records records, which
        bring too many random I/O, to many
        duplicate I/O
When Use Index?
•   Field used in WHERE more frequently, use
    index
•   Field like status or type, no index
    •   Contain too many records records, which
        bring too many random I/O, to many
        duplicate I/O
•   Field updated too often, no index
When Use Index?
•   Field used in WHERE more frequently, use
    index
•   Field like status or type, no index
    •   Contain too many records records, which
        bring too many random I/O, to many
        duplicate I/O
•   Field updated too often, no index
•   Field not in WHERE, no index
1 or N-Columns Index
1 or N-Columns Index
•   No absolute conclusion
1 or N-Columns Index
•   No absolute conclusion
•   When a filter field can filter data more than
    90% and the other filter fields will be updated
    often, which we can try to use composite index
1 or N-Columns Index
•   No absolute conclusion
•   When a filter field can filter data more than
    90% and the other filter fields will be updated
    often, which we can try to use composite index
•   Reduce the cost of index updating and disk
    space of index
1 or N-Columns Index
•   No absolute conclusion
•   When a filter field can filter data more than
    90% and the other filter fields will be updated
    often, which we can try to use composite index
•   Reduce the cost of index updating and disk
    space of index
•   let one index used in different quries
1 or N-Columns Index
•   No absolute conclusion
•   When a filter field can filter data more than
    90% and the other filter fields will be updated
    often, which we can try to use composite index
•   Reduce the cost of index updating and disk
    space of index
•   let one index used in different quries
•   Don’t over index
Index Prefixes
Index Prefixes
•   Index prefixes of CHAR,VARCHAR, BINARY,
    VARBINARY, BLOB, and TEXT columns
Index Prefixes
•   Index prefixes of CHAR,VARCHAR, BINARY,
    VARBINARY, BLOB, and TEXT columns
•   name char (200)
Index Prefixes
•   Index prefixes of CHAR,VARCHAR, BINARY,
    VARBINARY, BLOB, and TEXT columns
•   name char (200)
    •   most value are unique within the first 10-20
Index Prefixes
•   Index prefixes of CHAR,VARCHAR, BINARY,
    VARBINARY, BLOB, and TEXT columns
•   name char (200)
    •   most value are unique within the first 10-20
    •   CREATE INDEX part_of_name ON
        customer (name(10));
Index Prefixes
•   Index prefixes of CHAR,VARCHAR, BINARY,
    VARBINARY, BLOB, and TEXT columns
•   name char (200)
    •   most value are unique within the first 10-20
    •   CREATE INDEX part_of_name ON
        customer (name(10));
•   faster query and disk I/O reduction
Limitation of Mysql Index
•   MyISAM - the total length of index <= 1000 bytes
•   BLOB and TEXT only create Index Prefix
•   Mysql not support Function Index
•   “!=” or “<>”, won’t use index
•   abs(column) etc, won’t use index
•   Join (a.city = b.city). If the filter fileds’ type are not the
    same, mysql won’t use index
•   Like ‘%abc’, won’t use index
•   Hash index only can be used when “=”, “<=>”, “IN”
Join
Principle


• Nested Loop Join
Example
Mysql query optimization
users_group(g)
 index ref scan
Nested Loop (ref)
 g.group_id=m.group_id




users_group(g)    group_message(m)
 index ref scan     index ref scan
Nested Loop (ref)           Nested Loop (ref)
 g.group_id=m.group_id         m.id=c.group_msg_id




                                                      Result Set Output
users_group(g)    group_message(m)   group_message_content()
 index ref scan     index ref scan        index ref scan
Ideas for optimization
• Minimize the number of Nested Loop
• Give priority to optimizing the inner loop
• Indexing filter fields
 • ... FROM A, B WHERE B.group_id =
     A.group_id
• Join Buffer size, type is All, index, range,
  index_merge
Order By, Group By
How Satisfy Order By
How Satisfy Order By


• Use Index, without doing a any extra sorting
How Satisfy Order By


• Use Index, without doing a any extra sorting
• Use filesort algorithms
Use Index
Use Index
Use Index
SELECT col1, col2 FROM
                               sort
a ORDER BY [sort]
SELECT col1, col2 FROM
a WHERE colX=value          (colx, sort)
ORDER BY [sort]
SELECT * FROM a
WHERE uid=1 ORDER BY         (uid, x, y)
x, y
SELECT * FROM a
                          won’t use index
ORDER BY YEAR(date)
          ......               ......
Use Index
SELECT col1, col2 FROM
                               sort
a ORDER BY [sort]
SELECT col1, col2 FROM
a WHERE colX=value          (colx, sort)
ORDER BY [sort]
SELECT * FROM a
WHERE uid=1 ORDER BY         (uid, x, y)
x, y
SELECT * FROM a
                          won’t use index
ORDER BY YEAR(date)
          ......               ......
Use Index
SELECT col1, col2 FROM
                               sort
a ORDER BY [sort]
SELECT col1, col2 FROM
a WHERE colX=value          (colx, sort)
ORDER BY [sort]
SELECT * FROM a
WHERE uid=1 ORDER BY         (uid, x, y)
x, y
SELECT * FROM a
                          won’t use index
ORDER BY YEAR(date)
          ......               ......
Use Index
SELECT col1, col2 FROM
                               sort
a ORDER BY [sort]
SELECT col1, col2 FROM
a WHERE colX=value          (colx, sort)
ORDER BY [sort]
SELECT * FROM a
WHERE uid=1 ORDER BY         (uid, x, y)
x, y
SELECT * FROM a
                          won’t use index
ORDER BY YEAR(date)
          ......               ......
Use Index
SELECT col1, col2 FROM
                               sort
a ORDER BY [sort]
SELECT col1, col2 FROM
a WHERE colX=value          (colx, sort)
ORDER BY [sort]
SELECT * FROM a
WHERE uid=1 ORDER BY         (uid, x, y)
x, y
SELECT * FROM a
                          won’t use index
ORDER BY YEAR(date)
          ......               ......
Use Filesort

• increase max_length_for_stort_data
• remove return fields which are not
  necessary
• increase sort_buffer_size
How Satisfy Group By


• Loose Index Scan
• Tight Index Scan
Loose Index Scan
Loose Index Scan
Loose Index Scan
     Conditions                   Example

 The query is over a      SELECT c1, c2 FROM t1
    single table            GROUP BY c1, c2;
only columns that form
a leftmost prefix of the     index on (c1,c2,c3)
  index and no other          •    GROUP BY c1, c2
                              •    CROUP BY c2, c3
       columns.
only can use aggregate
                       SELECT c1, MIN(c2) FROM
 functions like MAX,
                           t1 GROUP BY c1;
         MIN
Loose Index Scan
     Conditions                   Example

 The query is over a      SELECT c1, c2 FROM t1
    single table            GROUP BY c1, c2;
only columns that form
a leftmost prefix of the     index on (c1,c2,c3)
  index and no other          •    GROUP BY c1, c2
                              •    CROUP BY c2, c3
       columns.
only can use aggregate
                       SELECT c1, MIN(c2) FROM
 functions like MAX,
                           t1 GROUP BY c1;
         MIN
Loose Index Scan
     Conditions                   Example

 The query is over a      SELECT c1, c2 FROM t1
    single table            GROUP BY c1, c2;
only columns that form
a leftmost prefix of the     index on (c1,c2,c3)
  index and no other          •    GROUP BY c1, c2
                              •    CROUP BY c2, c3
       columns.
only can use aggregate
                       SELECT c1, MIN(c2) FROM
 functions like MAX,
                           t1 GROUP BY c1;
         MIN
Loose Index Scan
     Conditions                   Example

 The query is over a      SELECT c1, c2 FROM t1
    single table            GROUP BY c1, c2;
only columns that form
a leftmost prefix of the     index on (c1,c2,c3)
  index and no other          •    GROUP BY c1, c2
                              •    CROUP BY c2, c3
       columns.
only can use aggregate
                       SELECT c1, MIN(c2) FROM
 functions like MAX,
                           t1 GROUP BY c1;
         MIN
Loose Index Scan
Loose Index Scan
Loose Index Scan
                            SELECT c1, c2 FROM t1
                              WHERE c1 < const
 Any other parts of the
                              GROUP BY c1, c2;
 index than those from
    the GROUP BY
                            SELECT MAX(c3), MIN
referenced in the query
                             (c3), c1, c2 FROM t1
   must be constants
                              WHERE c2 > const
                              GROUP BY c1, c2;

 Prefix index cannot be       col VARCHAR(20),
used for loose index scan     INDEX (col(10))
Loose Index Scan
                            SELECT c1, c2 FROM t1
                              WHERE c1 < const
 Any other parts of the
                              GROUP BY c1, c2;
 index than those from
    the GROUP BY
                            SELECT MAX(c3), MIN
referenced in the query
                             (c3), c1, c2 FROM t1
   must be constants
                              WHERE c2 > const
                              GROUP BY c1, c2;

 Prefix index cannot be       col VARCHAR(20),
used for loose index scan     INDEX (col(10))
Loose Index Scan


If loose index scan is applicable to a query,
the EXPLAIN output shows Using index for
group-by in the Extra column.
Mysql query optimization
Tight Index Scan
•   MySQL Query Optimizer
    •   If loose index scan are not met, then try
        tight index scan
•   Different with loose, tight
    •   After finding all index keys in WHERE
        conditions, then MySQL do the grouping
        operation
Tight Index Scan
Tight Index Scan
idx(c1,c2,c3) on table t1(c1,c2,c3,c4)
Tight Index Scan
  idx(c1,c2,c3) on table t1(c1,c2,c3,c4)
• A gap in the GROUP BY
   • SELECT c1, c2, c3 FROM t1 WHERE c2 =
     'a' GROUP BY c1, c3;
Tight Index Scan
  idx(c1,c2,c3) on table t1(c1,c2,c3,c4)
• A gap in the GROUP BY
   • SELECT c1, c2, c3 FROM t1 WHERE c2 =
     'a' GROUP BY c1, c3;
• not the first part of the key
   • SELECT c1, c2, c3 FROM t1 WHERE c1 =
     'a' GROUP BY c2, c3;
More...
• Books
 • <<MySQL                        >>,
    Author:

• Web Sites
 • http://dev.mysql.com/doc/refman/5.1/en/
    optimization.html
 • http://www.slideshare.net/
Q and A

More Related Content

PDF
Advanced MySQL Query Tuning
Alexander Rubin
 
PDF
How to Analyze and Tune MySQL Queries for Better Performance
oysteing
 
ODP
Introduction to PostgreSQL
Jim Mlodgenski
 
PDF
Load Data Fast!
Karwin Software Solutions LLC
 
PDF
Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013
Jaime Crespo
 
PPTX
Oracle: Joins
oracle content
 
PDF
The MySQL Query Optimizer Explained Through Optimizer Trace
oysteing
 
PDF
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
Hemant Kumar Singh
 
Advanced MySQL Query Tuning
Alexander Rubin
 
How to Analyze and Tune MySQL Queries for Better Performance
oysteing
 
Introduction to PostgreSQL
Jim Mlodgenski
 
Query Optimization with MySQL 5.6: Old and New Tricks - Percona Live London 2013
Jaime Crespo
 
Oracle: Joins
oracle content
 
The MySQL Query Optimizer Explained Through Optimizer Trace
oysteing
 
MySQL Indexing : Improving Query Performance Using Index (Covering Index)
Hemant Kumar Singh
 

What's hot (20)

PDF
How to Use JSON in MySQL Wrong
Karwin Software Solutions LLC
 
PPTX
MongoDB - Aggregation Pipeline
Jason Terpko
 
PDF
Spark SQL Deep Dive @ Melbourne Spark Meetup
Databricks
 
PPTX
Database Testing
Siva Kotilingam Pallikonda
 
PDF
Cassandra Database
YounesCharfaoui
 
PDF
MySQL: Indexing for Better Performance
jkeriaki
 
PDF
How to Design Indexes, Really
Karwin Software Solutions LLC
 
PPT
Unit 4 DBMS.ppt
HARRSHITHAASCSE
 
PPTX
Indexing the MySQL Index: Key to performance tuning
OSSCube
 
PPTX
Sql Constraints
I L0V3 CODING DR
 
PDF
Introduction to Redis
Dvir Volk
 
PPTX
Hash table in data structure and algorithm
Aamir Sohail
 
PPT
SQL Views
Aaron Buma
 
PDF
SQL Overview
Stewart Rogers
 
PPT
Solr Presentation
Gaurav Verma
 
PDF
MySQL JOINS
HripsimeGhaltaghchya
 
ODP
The PostgreSQL Query Planner
Command Prompt., Inc
 
PDF
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Jim Mlodgenski
 
PPTX
SQL Join Basic
Naimul Arif
 
PDF
SQL window functions for MySQL
Dag H. Wanvik
 
How to Use JSON in MySQL Wrong
Karwin Software Solutions LLC
 
MongoDB - Aggregation Pipeline
Jason Terpko
 
Spark SQL Deep Dive @ Melbourne Spark Meetup
Databricks
 
Database Testing
Siva Kotilingam Pallikonda
 
Cassandra Database
YounesCharfaoui
 
MySQL: Indexing for Better Performance
jkeriaki
 
How to Design Indexes, Really
Karwin Software Solutions LLC
 
Unit 4 DBMS.ppt
HARRSHITHAASCSE
 
Indexing the MySQL Index: Key to performance tuning
OSSCube
 
Sql Constraints
I L0V3 CODING DR
 
Introduction to Redis
Dvir Volk
 
Hash table in data structure and algorithm
Aamir Sohail
 
SQL Views
Aaron Buma
 
SQL Overview
Stewart Rogers
 
Solr Presentation
Gaurav Verma
 
The PostgreSQL Query Planner
Command Prompt., Inc
 
Top 10 Mistakes When Migrating From Oracle to PostgreSQL
Jim Mlodgenski
 
SQL Join Basic
Naimul Arif
 
SQL window functions for MySQL
Dag H. Wanvik
 
Ad

Viewers also liked (20)

PPTX
MySQL Performance Optimization #JDNL13
Eli Aschkenasy
 
PPTX
10 performance tips we tend to forget
Eli Aschkenasy
 
PDF
Zurich2007 MySQL Query Optimization
Hiệp Lê Tuấn
 
PPT
Building High Performance MySql Query Systems And Analytic Applications
guest40cda0b
 
PDF
MySQL Query Tuning for the Squeemish -- Fossetcon Orlando Sep 2014
Dave Stokes
 
PDF
56 Query Optimization
MYXPLAIN
 
PDF
MYSQL Query Anti-Patterns That Can Be Moved to Sphinx
Pythian
 
PDF
Query Optimization with MySQL 5.6: Old and New Tricks
MYXPLAIN
 
PPTX
Tunning sql query
vuhaininh88
 
PDF
MySQL Query tuning 101
Sveta Smirnova
 
PDF
Advanced MySQL Query and Schema Tuning
MYXPLAIN
 
PDF
MySQL Query Optimization
Morgan Tocker
 
PPT
My sql optimization
PrelovacMedia
 
PDF
Webinar 2013 advanced_query_tuning
晓 周
 
PDF
MySQL Query Optimization.
Remote MySQL DBA
 
PPT
Mysql ppt
Sanmuga Nathan
 
PDF
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Jaime Crespo
 
PDF
MySQL Query Optimization (Basics)
Karthik .P.R
 
PDF
Sql query patterns, optimized
Karwin Software Solutions LLC
 
PDF
MySQL Query And Index Tuning
Manikanda kumar
 
MySQL Performance Optimization #JDNL13
Eli Aschkenasy
 
10 performance tips we tend to forget
Eli Aschkenasy
 
Zurich2007 MySQL Query Optimization
Hiệp Lê Tuấn
 
Building High Performance MySql Query Systems And Analytic Applications
guest40cda0b
 
MySQL Query Tuning for the Squeemish -- Fossetcon Orlando Sep 2014
Dave Stokes
 
56 Query Optimization
MYXPLAIN
 
MYSQL Query Anti-Patterns That Can Be Moved to Sphinx
Pythian
 
Query Optimization with MySQL 5.6: Old and New Tricks
MYXPLAIN
 
Tunning sql query
vuhaininh88
 
MySQL Query tuning 101
Sveta Smirnova
 
Advanced MySQL Query and Schema Tuning
MYXPLAIN
 
MySQL Query Optimization
Morgan Tocker
 
My sql optimization
PrelovacMedia
 
Webinar 2013 advanced_query_tuning
晓 周
 
MySQL Query Optimization.
Remote MySQL DBA
 
Mysql ppt
Sanmuga Nathan
 
Query Optimization with MySQL 5.7 and MariaDB 10: Even newer tricks
Jaime Crespo
 
MySQL Query Optimization (Basics)
Karthik .P.R
 
Sql query patterns, optimized
Karwin Software Solutions LLC
 
MySQL Query And Index Tuning
Manikanda kumar
 
Ad

Similar to Mysql query optimization (20)

PDF
query optimization
Dimara Hakim
 
ODP
San diegophp
Dave Stokes
 
PDF
MySQL Query Optimisation 101
Federico Razzoli
 
PPT
Indexing
Davood Barfeh
 
PDF
Goldilocks and the Three MySQL Queries
Dave Stokes
 
PPTX
MySQL Indexes
Anton Zhukov
 
PDF
MySQL best practices at Trovit
Ivan Lopez
 
PDF
Introduction to Databases - query optimizations for MySQL
Márton Kodok
 
PDF
Scaling MySQL Strategies for Developers
Jonathan Levin
 
PDF
Zurich2007 MySQL Query Optimization
Hiệp Lê Tuấn
 
PDF
MySQL Indexing Crash Course
Aaron Silverman
 
PDF
Mentor Your Indexes
Karwin Software Solutions LLC
 
PDF
Troubleshooting MySQL Performance add-ons
Sveta Smirnova
 
PDF
Practical my sql performance optimization
Marian Marinov
 
PDF
Modern query optimisation features in MySQL 8.
Mydbops
 
PPTX
Guide To Mastering The MySQL Query Execution Plan
Optimiz DBA
 
PPTX
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Ontico
 
PDF
Percona Live 2012PPT: MySQL Query optimization
mysqlops
 
PPTX
PHP UK 2020 Tutorial: MySQL Indexes, Histograms And other ways To Speed Up Yo...
Dave Stokes
 
PDF
MySQL Performance Optimization
Mindfire Solutions
 
query optimization
Dimara Hakim
 
San diegophp
Dave Stokes
 
MySQL Query Optimisation 101
Federico Razzoli
 
Indexing
Davood Barfeh
 
Goldilocks and the Three MySQL Queries
Dave Stokes
 
MySQL Indexes
Anton Zhukov
 
MySQL best practices at Trovit
Ivan Lopez
 
Introduction to Databases - query optimizations for MySQL
Márton Kodok
 
Scaling MySQL Strategies for Developers
Jonathan Levin
 
Zurich2007 MySQL Query Optimization
Hiệp Lê Tuấn
 
MySQL Indexing Crash Course
Aaron Silverman
 
Mentor Your Indexes
Karwin Software Solutions LLC
 
Troubleshooting MySQL Performance add-ons
Sveta Smirnova
 
Practical my sql performance optimization
Marian Marinov
 
Modern query optimisation features in MySQL 8.
Mydbops
 
Guide To Mastering The MySQL Query Execution Plan
Optimiz DBA
 
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Ontico
 
Percona Live 2012PPT: MySQL Query optimization
mysqlops
 
PHP UK 2020 Tutorial: MySQL Indexes, Histograms And other ways To Speed Up Yo...
Dave Stokes
 
MySQL Performance Optimization
Mindfire Solutions
 

Recently uploaded (20)

PDF
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
PDF
Software Development Methodologies in 2025
KodekX
 
PDF
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
 
PDF
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
PDF
Enable Enterprise-Ready Security on IBM i Systems.pdf
Precisely
 
PDF
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
PDF
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
PPTX
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
PDF
Make GenAI investments go further with the Dell AI Factory - Infographic
Principled Technologies
 
PDF
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
PDF
This slide provides an overview Technology
mineshkharadi333
 
PPT
L2 Rules of Netiquette in Empowerment technology
Archibal2
 
PDF
agentic-ai-and-the-future-of-autonomous-systems.pdf
siddharthnetsavvies
 
PDF
CIFDAQ's Token Spotlight: SKY - A Forgotten Giant's Comeback?
CIFDAQ
 
PDF
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
PDF
Software Development Company | KodekX
KodekX
 
PDF
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
PDF
madgavkar20181017ppt McKinsey Presentation.pdf
georgschmitzdoerner
 
PPTX
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
PDF
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 
Automating ArcGIS Content Discovery with FME: A Real World Use Case
Safe Software
 
Software Development Methodologies in 2025
KodekX
 
BLW VOCATIONAL TRAINING SUMMER INTERNSHIP REPORT
codernjn73
 
Building High-Performance Oracle Teams: Strategic Staffing for Database Manag...
SMACT Works
 
Enable Enterprise-Ready Security on IBM i Systems.pdf
Precisely
 
Oracle AI Vector Search- Getting Started and what's new in 2025- AIOUG Yatra ...
Sandesh Rao
 
Security features in Dell, HP, and Lenovo PC systems: A research-based compar...
Principled Technologies
 
Comunidade Salesforce São Paulo - Desmistificando o Omnistudio (Vlocity)
Francisco Vieira Júnior
 
Make GenAI investments go further with the Dell AI Factory - Infographic
Principled Technologies
 
Advances in Ultra High Voltage (UHV) Transmission and Distribution Systems.pdf
Nabajyoti Banik
 
This slide provides an overview Technology
mineshkharadi333
 
L2 Rules of Netiquette in Empowerment technology
Archibal2
 
agentic-ai-and-the-future-of-autonomous-systems.pdf
siddharthnetsavvies
 
CIFDAQ's Token Spotlight: SKY - A Forgotten Giant's Comeback?
CIFDAQ
 
Revolutionize Operations with Intelligent IoT Monitoring and Control
Rejig Digital
 
Software Development Company | KodekX
KodekX
 
How-Cloud-Computing-Impacts-Businesses-in-2025-and-Beyond.pdf
Artjoker Software Development Company
 
madgavkar20181017ppt McKinsey Presentation.pdf
georgschmitzdoerner
 
cloud computing vai.pptx for the project
vaibhavdobariyal79
 
Google I/O Extended 2025 Baku - all ppts
HusseinMalikMammadli
 

Mysql query optimization

  • 1. MySQL Query Optimization 2010.07.09 Cai Baohua
  • 2. Agenda • What the query optimizer is • The principles of the optimization • Explain and Profiling • Use Index • JOIN Optimization • ORDER BY, GROUP BY Optimization
  • 4. MySQl Query Optimizer Parser Table Table Optimizer Modification Maintenance ..... Module Module Access Control Module
  • 5. MySQl Query Optimizer • Not only CBO but aslo CBO + RBO • Cost Base Optimizer • Rule Base Optimizer
  • 6. The Principles Of the Optimization
  • 8. Optimizing the query which need more optimization
  • 9. Optimizing the query which need more optimization • Identify the performance bottleneck
  • 10. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects
  • 11. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often
  • 12. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often • Always using the small result set to drive the large result set
  • 13. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often • Always using the small result set to drive the large result set • Complete the sequencing in the index as much as possible
  • 14. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often • Always using the small result set to drive the large result set • Complete the sequencing in the index as much as possible • Fetch the only fields that we need
  • 15. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often • Always using the small result set to drive the large result set • Complete the sequencing in the index as much as possible • Fetch the only fields that we need • Only use the most effective conditions of the filter
  • 16. Optimizing the query which need more optimization • Identify the performance bottleneck • Find clear optimization objects • Start with Explain and use Profile more often • Always using the small result set to drive the large result set • Complete the sequencing in the index as much as possible • Fetch the only fields that we need • Only use the most effective conditions of the filter • Avoid the complex Join and sub queries as far as possible
  • 18. Use Explain and Profiling Explain tells you: • In which order the tables are read • What types of read operations that are made • Which indexes could have been used • Which indexes are used • How the tables refer to each other • How many rows the optimizer estimates to retrieve from each table
  • 19. Use Explain and Profiling
  • 20. Use Explain and Profiling Explain Types Different join types. system !"#$%&'(#$"&)$*+(,$*+#$-*.$ const /%$%"#$0*)%$*+#$0&%1"2+3$-*.4$%-#&%#5$&)$&$ 1*+)%&+%$ eq_ref 6+#$-*.$7#-$-*.$8-*0$7-#92*:)$%&'(#)$ ref ;#9#-&($-*.)$.2%"$0&%1"2+3$2+5#<$9&(:#$ ref_or_null =2>#$-#84$7(:)$?@==$9&(:#)$ index_merge ;#9#-&($2+5#<$)#&-1"#)$&-#$0#-3#5$ unique_subquery ;&0#$&)$-#8$8*-$)*0#$):'A:#-2#)$ index_subquery /)$&'*9#$8*-$+*+B:+2A:#$2+5#<#)$ range /$-&+3#$2+5#<$)1&+$ index !"#$."*(#$2+5#<$2)$)1&++#5$ ALL /$8:(($%&'(#$)1&+$
  • 21. Use Explain and Profiling Explain Types Different join types. system !"#$%&'(#$"&)$*+(,$*+#$-*.$ good const /%$%"#$0*)%$*+#$0&%1"2+3$-*.4$%-#&%#5$&)$&$ 1*+)%&+%$ eq_ref 6+#$-*.$7#-$-*.$8-*0$7-#92*:)$%&'(#)$ ref ;#9#-&($-*.)$.2%"$0&%1"2+3$2+5#<$9&(:#$ ref_or_null =2>#$-#84$7(:)$?@==$9&(:#)$ index_merge ;#9#-&($2+5#<$)#&-1"#)$&-#$0#-3#5$ unique_subquery ;&0#$&)$-#8$8*-$)*0#$):'A:#-2#)$ index_subquery /)$&'*9#$8*-$+*+B:+2A:#$2+5#<#)$ range /$-&+3#$2+5#<$)1&+$ index !"#$."*(#$2+5#<$2)$)1&++#5$ ALL /$8:(($%&'(#$)1&+$ bad
  • 22. Use Explain and Profiling Explain Extra This column contains additional information about how MySQL resolves the query. Using index !"#$%#&'()$*&$+%#,)#-$&)%,*.")$/%01$)"#$*2-#3$ Using where 40)$,(($%05&$,%#$'&#-$*2$)"#$%#&'()$ Distinct 62(7$,$&*2.(#$%05$*&$%#,-$8#%$%05$+019*2,:02$ Not exists ;$LEFT JOIN$1*&&*2.$%05&$08:1*<,:02$*&$'&#-$ Using filesort ;2$#3)%,$%05$&0%:2.$&)#8$*&$-02#$ Using temporary ;$)#180%,%7$),9(#$*&$'&#-$ Range checked !"#$%#,-$)78#$*&$08:1*<#-$*2-*=*-',((7$/0%$#,+"$ for each record +019*2,:02$0/$%05&$/%01$)"#$8%#=*0'&$),9(#&$
  • 23. Use Explain and Profiling • Open / Close Query Profiler mysql> set profiling = 1 (close: 0)
  • 24. Use Explain and Profiling Show profiles
  • 25. Use Explain and Profiling SHOW PROFILE • ALL - displays all information • BLOCK IO - displays counts for block input and output operations • CONTEXT SWITCHES - displays counts for voluntary and involuntary context switches • IPC - displays counts for messages sent and received • MEMORY - is not currently implemented • PAGE FAULTS - displays counts for major and minor page faults • SOURCE - displays the names of functions from the source code, together with the name and line number of the file in which the function occurs • SWAPS - displays swap count
  • 26. Use Explain and Profiling Show more info
  • 29. Index Types • Balance-Tree • Primary Key • Secondary Index • InnoDB, MyISAM often use
  • 30. Index Types • Balance-Tree • Primary Key • Secondary Index • InnoDB, MyISAM often use • Hash • Memory, NDB Cluster • “=”, “IN”, “<=>” not > < between != like • not work for ORDER BY
  • 31. Index Types • Balance-Tree • Primary Key • Secondary Index • InnoDB, MyISAM often use • Hash • Memory, NDB Cluster • “=”, “IN”, “<=>” not > < between != like • not work for ORDER BY • Fulltext • CHAR,VARCHAR and TEXT • Uses it instead of LIKE ‘%*****%’, more efficient
  • 32. Index Types • Balance-Tree • Primary Key • Secondary Index • InnoDB, MyISAM often use • Hash • Memory, NDB Cluster • “=”, “IN”, “<=>” not > < between != like • not work for ORDER BY • Fulltext • CHAR,VARCHAR and TEXT • Uses it instead of LIKE ‘%*****%’, more efficient • R-Tree • to solve the problem of spatial data retrieval • only data type: GEOMETRY
  • 33. Pros and Cons of Index
  • 34. Pros and Cons of Index • Pros • Improve the efficiency of data retrieval • Reduce the cost of database I/O • Reduce the cost of data sorting
  • 35. Pros and Cons of Index • Pros • Improve the efficiency of data retrieval • Reduce the cost of database I/O • Reduce the cost of data sorting • Cons • index will take more disk space • slow the speed of updating table (insert, update, delete)
  • 37. When Use Index? • Field used in WHERE more frequently, use index
  • 38. When Use Index? • Field used in WHERE more frequently, use index • Field like status or type, no index
  • 39. When Use Index? • Field used in WHERE more frequently, use index • Field like status or type, no index • Contain too many records records, which bring too many random I/O, to many duplicate I/O
  • 40. When Use Index? • Field used in WHERE more frequently, use index • Field like status or type, no index • Contain too many records records, which bring too many random I/O, to many duplicate I/O • Field updated too often, no index
  • 41. When Use Index? • Field used in WHERE more frequently, use index • Field like status or type, no index • Contain too many records records, which bring too many random I/O, to many duplicate I/O • Field updated too often, no index • Field not in WHERE, no index
  • 42. 1 or N-Columns Index
  • 43. 1 or N-Columns Index • No absolute conclusion
  • 44. 1 or N-Columns Index • No absolute conclusion • When a filter field can filter data more than 90% and the other filter fields will be updated often, which we can try to use composite index
  • 45. 1 or N-Columns Index • No absolute conclusion • When a filter field can filter data more than 90% and the other filter fields will be updated often, which we can try to use composite index • Reduce the cost of index updating and disk space of index
  • 46. 1 or N-Columns Index • No absolute conclusion • When a filter field can filter data more than 90% and the other filter fields will be updated often, which we can try to use composite index • Reduce the cost of index updating and disk space of index • let one index used in different quries
  • 47. 1 or N-Columns Index • No absolute conclusion • When a filter field can filter data more than 90% and the other filter fields will be updated often, which we can try to use composite index • Reduce the cost of index updating and disk space of index • let one index used in different quries • Don’t over index
  • 49. Index Prefixes • Index prefixes of CHAR,VARCHAR, BINARY, VARBINARY, BLOB, and TEXT columns
  • 50. Index Prefixes • Index prefixes of CHAR,VARCHAR, BINARY, VARBINARY, BLOB, and TEXT columns • name char (200)
  • 51. Index Prefixes • Index prefixes of CHAR,VARCHAR, BINARY, VARBINARY, BLOB, and TEXT columns • name char (200) • most value are unique within the first 10-20
  • 52. Index Prefixes • Index prefixes of CHAR,VARCHAR, BINARY, VARBINARY, BLOB, and TEXT columns • name char (200) • most value are unique within the first 10-20 • CREATE INDEX part_of_name ON customer (name(10));
  • 53. Index Prefixes • Index prefixes of CHAR,VARCHAR, BINARY, VARBINARY, BLOB, and TEXT columns • name char (200) • most value are unique within the first 10-20 • CREATE INDEX part_of_name ON customer (name(10)); • faster query and disk I/O reduction
  • 54. Limitation of Mysql Index • MyISAM - the total length of index <= 1000 bytes • BLOB and TEXT only create Index Prefix • Mysql not support Function Index • “!=” or “<>”, won’t use index • abs(column) etc, won’t use index • Join (a.city = b.city). If the filter fileds’ type are not the same, mysql won’t use index • Like ‘%abc’, won’t use index • Hash index only can be used when “=”, “<=>”, “IN”
  • 55. Join
  • 60. Nested Loop (ref) g.group_id=m.group_id users_group(g) group_message(m) index ref scan index ref scan
  • 61. Nested Loop (ref) Nested Loop (ref) g.group_id=m.group_id m.id=c.group_msg_id Result Set Output users_group(g) group_message(m) group_message_content() index ref scan index ref scan index ref scan
  • 62. Ideas for optimization • Minimize the number of Nested Loop • Give priority to optimizing the inner loop • Indexing filter fields • ... FROM A, B WHERE B.group_id = A.group_id • Join Buffer size, type is All, index, range, index_merge
  • 65. How Satisfy Order By • Use Index, without doing a any extra sorting
  • 66. How Satisfy Order By • Use Index, without doing a any extra sorting • Use filesort algorithms
  • 69. Use Index SELECT col1, col2 FROM sort a ORDER BY [sort] SELECT col1, col2 FROM a WHERE colX=value (colx, sort) ORDER BY [sort] SELECT * FROM a WHERE uid=1 ORDER BY (uid, x, y) x, y SELECT * FROM a won’t use index ORDER BY YEAR(date) ...... ......
  • 70. Use Index SELECT col1, col2 FROM sort a ORDER BY [sort] SELECT col1, col2 FROM a WHERE colX=value (colx, sort) ORDER BY [sort] SELECT * FROM a WHERE uid=1 ORDER BY (uid, x, y) x, y SELECT * FROM a won’t use index ORDER BY YEAR(date) ...... ......
  • 71. Use Index SELECT col1, col2 FROM sort a ORDER BY [sort] SELECT col1, col2 FROM a WHERE colX=value (colx, sort) ORDER BY [sort] SELECT * FROM a WHERE uid=1 ORDER BY (uid, x, y) x, y SELECT * FROM a won’t use index ORDER BY YEAR(date) ...... ......
  • 72. Use Index SELECT col1, col2 FROM sort a ORDER BY [sort] SELECT col1, col2 FROM a WHERE colX=value (colx, sort) ORDER BY [sort] SELECT * FROM a WHERE uid=1 ORDER BY (uid, x, y) x, y SELECT * FROM a won’t use index ORDER BY YEAR(date) ...... ......
  • 73. Use Index SELECT col1, col2 FROM sort a ORDER BY [sort] SELECT col1, col2 FROM a WHERE colX=value (colx, sort) ORDER BY [sort] SELECT * FROM a WHERE uid=1 ORDER BY (uid, x, y) x, y SELECT * FROM a won’t use index ORDER BY YEAR(date) ...... ......
  • 74. Use Filesort • increase max_length_for_stort_data • remove return fields which are not necessary • increase sort_buffer_size
  • 75. How Satisfy Group By • Loose Index Scan • Tight Index Scan
  • 78. Loose Index Scan Conditions Example The query is over a SELECT c1, c2 FROM t1 single table GROUP BY c1, c2; only columns that form a leftmost prefix of the index on (c1,c2,c3) index and no other • GROUP BY c1, c2 • CROUP BY c2, c3 columns. only can use aggregate SELECT c1, MIN(c2) FROM functions like MAX, t1 GROUP BY c1; MIN
  • 79. Loose Index Scan Conditions Example The query is over a SELECT c1, c2 FROM t1 single table GROUP BY c1, c2; only columns that form a leftmost prefix of the index on (c1,c2,c3) index and no other • GROUP BY c1, c2 • CROUP BY c2, c3 columns. only can use aggregate SELECT c1, MIN(c2) FROM functions like MAX, t1 GROUP BY c1; MIN
  • 80. Loose Index Scan Conditions Example The query is over a SELECT c1, c2 FROM t1 single table GROUP BY c1, c2; only columns that form a leftmost prefix of the index on (c1,c2,c3) index and no other • GROUP BY c1, c2 • CROUP BY c2, c3 columns. only can use aggregate SELECT c1, MIN(c2) FROM functions like MAX, t1 GROUP BY c1; MIN
  • 81. Loose Index Scan Conditions Example The query is over a SELECT c1, c2 FROM t1 single table GROUP BY c1, c2; only columns that form a leftmost prefix of the index on (c1,c2,c3) index and no other • GROUP BY c1, c2 • CROUP BY c2, c3 columns. only can use aggregate SELECT c1, MIN(c2) FROM functions like MAX, t1 GROUP BY c1; MIN
  • 84. Loose Index Scan SELECT c1, c2 FROM t1 WHERE c1 < const Any other parts of the GROUP BY c1, c2; index than those from the GROUP BY SELECT MAX(c3), MIN referenced in the query (c3), c1, c2 FROM t1 must be constants WHERE c2 > const GROUP BY c1, c2; Prefix index cannot be col VARCHAR(20), used for loose index scan INDEX (col(10))
  • 85. Loose Index Scan SELECT c1, c2 FROM t1 WHERE c1 < const Any other parts of the GROUP BY c1, c2; index than those from the GROUP BY SELECT MAX(c3), MIN referenced in the query (c3), c1, c2 FROM t1 must be constants WHERE c2 > const GROUP BY c1, c2; Prefix index cannot be col VARCHAR(20), used for loose index scan INDEX (col(10))
  • 86. Loose Index Scan If loose index scan is applicable to a query, the EXPLAIN output shows Using index for group-by in the Extra column.
  • 88. Tight Index Scan • MySQL Query Optimizer • If loose index scan are not met, then try tight index scan • Different with loose, tight • After finding all index keys in WHERE conditions, then MySQL do the grouping operation
  • 90. Tight Index Scan idx(c1,c2,c3) on table t1(c1,c2,c3,c4)
  • 91. Tight Index Scan idx(c1,c2,c3) on table t1(c1,c2,c3,c4) • A gap in the GROUP BY • SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3;
  • 92. Tight Index Scan idx(c1,c2,c3) on table t1(c1,c2,c3,c4) • A gap in the GROUP BY • SELECT c1, c2, c3 FROM t1 WHERE c2 = 'a' GROUP BY c1, c3; • not the first part of the key • SELECT c1, c2, c3 FROM t1 WHERE c1 = 'a' GROUP BY c2, c3;
  • 93. More... • Books • <<MySQL >>, Author: • Web Sites • http://dev.mysql.com/doc/refman/5.1/en/ optimization.html • http://www.slideshare.net/