SlideShare ist ein Scribd-Unternehmen logo
1 von 72
How to Design
Indexes, Really
Bill Karwin, Percona Inc.
It’s About Performance
• What s the most frequent recommendation in
database performance audits?

• What s the easiest way to speed up SQL queries,
without schema changes or code changes?

• What s a commonly neglected part of database
development and maintenance?

indexes.	

www.percona.com
Indexing Mistakes	


www.percona.com
Index Shotgun

Indexes improve performance, 
so I index every column. 	


www.percona.com
Index Shotgun
• Many such indexes are never used.
• Indexes occupy space on disk in memory buffers.
• Each index needs to be modified during INSERT,
UPDATE, DELETE.

• Query optimizer considers indexes during every
query, more indexes makes this work harder.

www.percona.com
Index Aversion

Indexes have overhead, 
so I never create any indexes. 	


www.percona.com
Index Aversion
• The right indexes are crucial to speed up queries.
• Most workloads are read-heavy, so the net benefit
of indexes outweighs the overhead of updating.

• Indexes are compact, so they are a more efficient
use of buffer memory.

www.percona.com
SQL Aversion

I use a NoSQL database 
because it just works. *	


(* after I create the right indexes.)
www.percona.com
SQL Aversion
• Many non-relational databases require you to
define indexes explicitly too.

• The ANSI/ISO SQL standard doesn t specify
anything about indexes.

• So if you want to use NoSQL, just use indexes!

:-)

www.percona.com
Naive Questions

Here s my schema... 

what indexes do I need? 	


Copyright 2012 Gene Ontology Consortium http://www.geneontology.org/

www.percona.com
Naive Questions
• Index choice depends on...
•  What tables and columns you need to query
•  What JOINs you need to perform
•  What GROUP BY s and ORDER BY s you need

• Index design is not implicit from table design.

www.percona.com
Lesson #1

relational	

schema
design is 
based on
data.	


but

index 
design is
based on
queries.	

www.percona.com
Where Are the Queries?

• Slow query log
• General query log
• Application logging
• Tcpdump
• Binary log
• Process list
www.percona.com
Collecting Log of Queries
• Enable slow-query log:
mysql SET GLOBAL slow_query_log = ON;!

• Include all queries, not just those that are slow:
mysql SET GLOBAL long_query_time = 0;!

• Percona Server can log more information:
mysql SET GLOBAL log_slow_verbosity =
'full';!

www.percona.com
Where to Start?

pt-query-digest	


http://www.percona.com/doc/percona-toolkit/pt-query-digest.html
www.percona.com
pt-query-digest
• Analyzes your query log.
• Reports the queries accounting for greatest load.
•  Slow queries.
•  Quick queries that run frequently.

• Outputs a ranked list of top query patterns.
$ pt-query-digest 

/var/lib/mysql/mysql-slow.log 

 ~/pqd.txt!

www.percona.com
Ranked Queries
# Profile!
# Rank Query ID
# ==== ==================
#
1 0xA8D2BBDE7EBE7822
#
2 0xFE25DAF5DBB71F49
#
3 0x70DAC639802CA233
#
4 0xE336B880F4FEC4B8
#
5 0x60550B93960F1837
#
6 0xF46D5C09B4E0CA2F
#
7 0x09FCFFF0E5BC929F
#
8 0x9433950BE12B9470
#
9 0x4DC0E044996DA715
#
10 0x09FB72D72ED18E93
!

Response time
===============
4932.2992 28.8%
4205.2160 24.6%
1299.6269 7.6%
1184.5101 6.9%
905.1648 5.3%
777.2446 4.5%
747.4346 4.4%
744.1755 4.4%
448.5637 2.6%
361.1904 2.1%

Calls
=====
78
130
14
294
60
16340
130
14368
130
78

R/Call
=======
63.2346
32.3478
92.8305
4.0289
15.0861
0.0476
5.7495
0.0518
3.4505
4.6306

Apdx V/M
==== =====
0.00 5.22
0.00 3.47
0.00 0.17
0.36 2.29
0.05 1.33
1.00 0.17
0.53 7.69
1.00 0.18
0.65 8.31
0.28 1.89

Item!
=======!
SELECT person_info!
SELECT title!
SELECT cast_info!
SELECT cast_info!
SELECT name!
SELECT char_name!
SELECT name!
SELECT name!
SELECT title!
SELECT cast_info title!

www.percona.com
Slow Queries
# Profile!
# Rank Query ID
# ==== ==================
#
1 0xA8D2BBDE7EBE7822
#
2 0xFE25DAF5DBB71F49
#
3 0x70DAC639802CA233
#
4 0xE336B880F4FEC4B8
#
5 0x60550B93960F1837
#
6 0xF46D5C09B4E0CA2F
#
7 0x09FCFFF0E5BC929F
#
8 0x9433950BE12B9470
#
9 0x4DC0E044996DA715
#
10 0x09FB72D72ED18E93
!

Response time
===============
4932.2992 28.8%
4205.2160 24.6%
1299.6269 7.6%
1184.5101 6.9%
905.1648 5.3%
777.2446 4.5%
747.4346 4.4%
744.1755 4.4%
448.5637 2.6%
361.1904 2.1%

Calls
=====
78
130
14
294
60
16340
130
14368
130
78

R/Call
=======
63.2346
32.3478
92.8305
4.0289
15.0861
0.0476
5.7495
0.0518
3.4505
4.6306

Apdx V/M
==== =====
0.00 5.22
0.00 3.47
0.00 0.17
0.36 2.29
0.05 1.33
1.00 0.17
0.53 7.69
1.00 0.18
0.65 8.31
0.28 1.89

Item!
=======!
SELECT person_info!
SELECT title!
SELECT cast_info!
SELECT cast_info!
SELECT name!
SELECT char_name!
SELECT name!
SELECT name!
SELECT title!
SELECT cast_info title!

this query executed a few times,
but each takes over 1 minute
www.percona.com
Quick Queries
# Profile!
# Rank Query ID
# ==== ==================
#
1 0xA8D2BBDE7EBE7822
#
2 0xFE25DAF5DBB71F49
#
3 0x70DAC639802CA233
#
4 0xE336B880F4FEC4B8
#
5 0x60550B93960F1837
#
6 0xF46D5C09B4E0CA2F
#
7 0x09FCFFF0E5BC929F
#
8 0x9433950BE12B9470
#
9 0x4DC0E044996DA715
#
10 0x09FB72D72ED18E93
!

Response time
===============
4932.2992 28.8%
4205.2160 24.6%
1299.6269 7.6%
1184.5101 6.9%
905.1648 5.3%
777.2446 4.5%
747.4346 4.4%
744.1755 4.4%
448.5637 2.6%
361.1904 2.1%

Calls
=====
78
130
14
294
60
16340
130
14368
130
78

R/Call
=======
63.2346
32.3478
92.8305
4.0289
15.0861
0.0476
5.7495
0.0518
3.4505
4.6306

Apdx V/M
==== =====
0.00 5.22
0.00 3.47
0.00 0.17
0.36 2.29
0.05 1.33
1.00 0.17
0.53 7.69
1.00 0.18
0.65 8.31
0.28 1.89

Item!
=======!
SELECT person_info!
SELECT title!
SELECT cast_info!
SELECT cast_info!
SELECT name!
SELECT char_name!
SELECT name!
SELECT name!
SELECT title!
SELECT cast_info title!

another query executed
frequently, each call is quick
www.percona.com
Understanding 
Indexes by Analogy	


www.percona.com
This is a Telephone Book

• A telephone book is like an index sorted

by last name first, first name last.
• Also includes the person s phone number.

Thomas Siencki
http://en.wikipedia.org/wiki/File:Telefonbog_ubt-1.JPG

www.percona.com
Implementation
• In MySQL syntax, this would look like the
following:

CREATE INDEX phone_idx ON TelephoneBook 

(last_name, first_name, phone_number);!

www.percona.com
Simple Searches
• Since the index is pre-sorted, it benefits queries
for last name:

SELECT * FROM TelephoneBook 

WHERE last_name = 'Smith';!

• By benefit, we mean that it helps to narrow down
the search quickly, because the entries are
already in sorted order.

www.percona.com
Compound Searches
• The sort order benefits us further if we search on
last name and first name together:

SELECT * FROM TelephoneBook 

WHERE last_name = 'Smith' 

AND first_name = 'John';!

www.percona.com
When the Index Fails
• But if we search only on first_name, the sort order
doesn t help:

SELECT * FROM TelephoneBook 

WHERE first_name = 'John';!

• The

John entries occur throughout the book, in
an unpredictable distribution. Anyone s first name
can be John . We have to search every page of
the book.

www.percona.com
Order Matters
• From this, we conclude that the order we define
the columns in an index matters.

• An index with the columns declared in the

opposite order would benefit a search for first
name alone, but then it wouldn t help a search for
last name alone.
CREATE INDEX phone_idx2 ON TelephoneBook 

(first_name, last_name, phone_number);!

www.percona.com
Both Indexes Can Be Helpful
• If both criteria use equality comparisons, then the
order of columns shouldn t matter.

• Either index would benefit a query that searches
for a specific value in both columns.
SELECT * FROM TelephoneBook 

WHERE last_name = 'Smith' 

AND first_name = 'John';!

www.percona.com
Range Comparisons
• Searching for multiple names is another case.
• An index still helps us to narrow the search even if
we search for all names that match a pattern:
SELECT * FROM TelephoneBook 

WHERE last_name LIKE 'S%';!

• The book groups all the names starting with

S
together, so the index can help us to avoid reading
the whole book.

www.percona.com
Compound Range Comparisons
• If we search by a range of last names, but a

specific first name, then the first names are again
distributed in an unpredictable way among the
matching last names:
SELECT * FROM TelephoneBook 

WHERE last_name LIKE 'S%' 

AND first_name = 'John';!

• The

John entries are not grouped together
among all S names, so we have to search
manually every S name to find the ones we want.
www.percona.com
Order Matters
• From this we see that once we do a range

comparison on a column in an index, any criteria
we have for subsequent columns cannot benefit
from the index.
CREATE INDEX phone_idx ON TelephoneBook 

(last_name, first_name, phone_number);!

this column in the index
helps the range search

but then subsequent columns
do not help searching

www.percona.com
Sorting by Index
• Since the telephone book is pre-sorted, we can

rely on this if we need to read through the entries
in that order.
SELECT * FROM TelephoneBook 

WHERE last_name = 'Smith'

ORDER BY first_name;!

• There s no extra work to do here; we can simply
read the entries in the order they are naturally
written in the book.

•  So the ORDER BY is a no-op.
www.percona.com
When the Index Can t Help Sorting
• Sorting by any other column is another story.
SELECT * FROM TelephoneBook 

WHERE last_name = 'Smith'

ORDER BY phone_number;!

• The book is already ordered by last name and

then by first name, but not numerically by phone
number.

• To get the result sorted in the manner above, we
could copy the Smith entries onto sticky notes,
then re-order the sticky notes by phone number
manually.

www.percona.com
Order Matters
• From this, we conclude that an index helps if we
sort by the column immediately following the
columns in the search criteria.

• But if we need to sort by another column later in

the index, or by a column that isn t in the index at
all, we have to do it the hard way.

www.percona.com
Index-Only Searches
• Once we find the matching entries, we may need
other fields of information:

SELECT phone_number 

FROM TelephoneBook 

WHERE last_name = 'Smith' 

AND first_name = 'John';!

• Because the phone number is included in the

index entry, we get it for free. The entry includes
all three fields, even if our query didn t search for
the phone number explicitly.
www.percona.com
When the Index Can t Help
• If we need other information that isn t included in
the index, we may need to do extra work.

SELECT business_hours 

FROM TelephoneBook 

WHERE last_name = 'Smith Plumbing';!

• In this case, we d have to use the phone number
of the business, and call them to ask their hours.

•  That s the extra work.

www.percona.com
Columns Matter
• From this, we conclude that putting columns in an
index can be very important for certain queries,
even if that query doesn t use the columns for
searching or sorting.

• This is called a covering index.

www.percona.com
Lesson #2

rate your
indexes
using the
star system.	

www.percona.com
The Star System
• Rate an index with respect to a
given query by three stars
which describe effectiveness.

• This technique is covered in

Relational Database Index
Design and the Optimizers by
Tapio Lahdenmäki and Michael
Leach.
• 

http://www.wiley.com/WileyCDA/WileyTitle/
productCd-0471719994.html

www.percona.com
The Star System
★ First star:

The index sorts the rows so the ones you want
are found together in a single group.

★ Second star:

Rows referenced by your query are ordered in
the index the way you want them.

★ Third star:

The index contains all columns referenced by
your query (covering index).

www.percona.com
Look at this Terrible Query
mysql EXPLAIN SELECT person_id, person_role_id
FROM cast_info 

WHERE movie_id = 91280 AND role_id = 1 

ORDER BY nr_order ASCG!
!
scans whole table
id: 1!
select_type: SIMPLE!
uses no index
table: cast_info!
type: ALL!
scans a lot of rows
possible_keys: NULL!
key: NULL!
sorts the hard way
key_len: NULL!
ref: NULL!
rows: 24008907!
Extra: Using where; Using filesort!
www.percona.com
★ First Star
★ Pick all columns from equality predicates.
Define the index with these columns first.

SELECT person_id, person_role_id 

FROM cast_info 

WHERE movie_id = 91280 AND role_id = 1 

ORDER BY nr_order ASC;!
equality predicates
ALTER TABLE cast_info ADD INDEX
(movie_id, role_id);!
www.percona.com
★ Second Star
★ Add the column(s) in the GROUP
BY clause, if the query has one.

BY or ORDER

SELECT person_id, person_role_id 

FROM cast_info 

WHERE movie_id = 91280 AND role_id = 1 

ORDER BY nr_order ASC;!
sorting column
ALTER TABLE cast_info ADD INDEX
(movie_id, role_id, nr_order);!
www.percona.com
★ Third Star
★ Add any remaining columns referenced in the
SELECT list.

SELECT person_id, person_role_id 

FROM cast_info 

WHERE movie_id = 91280 AND role_id = 1 

ORDER BY nr_order ASC;!
select-list columns
ALTER TABLE cast_info ADD INDEX
(movie_id, role_id, nr_order, person_id,
person_role_id);!
www.percona.com
Explain That
mysql EXPLAIN SELECT person_id,
person_role_id FROM cast_info 

WHERE movie_id = 91280 AND role_id = 1 

ORDER BY nr_order ASCG!
!
★1: effective index
id: 1!
select_type: SIMPLE!
★2: no filesort
table: cast_info!
type: ref!
possible_keys: movie_id!
key: movie_id! ★3: covering index
key_len: 8!
ref: const,const!
rows: 57!
Extra: Using where; Using index!
www.percona.com
Complications
• Can t achieve First-Star indexes when:
•  WHERE clause has more complex expressions
including OR predicates (disjunction).

SELECT * FROM TelephoneBook

WHERE last_name = 'Smith' 

OR first_name = 'John'!
disjunction

www.percona.com
Complications
• Can t achieve Second-Star indexes when:
•  WHERE clause includes range predicates

(, , !=, NOT IN, BETWEEN, LIKE, etc.).

•  Query includes both GROUP

BY and ORDER BY
referencing different columns.

•  Query must sort by multiple columns over different
tables (can t make a single index span tables).

•  Query includes ORDER

BY in a different order than
the order in which rows are accessed.

www.percona.com
Complications
• Can t achieve Third-Star indexes when:
•  Query requires more columns than the maximum of
16 columns per index.

•  Query requires BLOB, TEXT, or VARCHAR columns
longer than the maximum of 1000 bytes per index
(utf8 counts three bytes per character).

www.percona.com
Example Query	


www.percona.com
Example Query
mysql EXPLAIN SELECT STRAIGHT_JOIN n.* 

FROM char_name AS c 

INNER JOIN cast_info AS i 

!ON c.id=i.person_role_id 

INNER JOIN name AS n 

!ON i.person_id=n.id 

WHERE c.name = 'James Bond'

ORDER BY n.nameG!

char_name!

cast_info!

name!

www.percona.com
Not Optimized
***************************
id: 1!
select_type: SIMPLE!
table: c!
type: ALL!
possible_keys: PRIMARY!
key: NULL!
key_len: NULL!
ref: NULL!
rows: 2402968!
Extra: Using where;
***************************
id: 1!
select_type: SIMPLE!
table: i!
type: index!
possible_keys: person_id!
key: person_id!
key_len: 9!
ref: NULL!
rows: 21676661!
Extra: Using where;
***************************
id: 1!
select_type: SIMPLE!
table: n!
type: eq_ref!

1. row ***************************!

2.4 million × 21.7 million
= 52 trillion comparisons
Using temporary; Using filesort!
2. row ***************************!

Using index; Using join buffer!
3. row ***************************!

www.percona.com
Add Indexes
★ First-star index:
mysql ALTER TABLE char_name 

ADD INDEX n (name(20));!
★ Third-star index:
mysql ALTER TABLE cast_info 

ADD INDEX pr_p (person_role_id, person_id);!

char_name!

cast_info!

name!

www.percona.com
Optimized
***************************
id: 1!
select_type: SIMPLE!
table: c!
type: ref!
possible_keys: PRIMARY,n!
key: n!
key_len: 62!
ref: const!
rows: 1!
Extra: Using where;
***************************
id: 1!
select_type: SIMPLE!
table: i!
type: ref!
possible_keys: pr_p!
key: pr_p!
key_len: 5!
ref: imdb.c.id!
rows: 108383!
Extra: Using where;
***************************
id: 1!
select_type: SIMPLE!
table: n!
type: eq_ref!

1. row ***************************!

improved by a factor
of 480 million!
Using temporary; Using filesort!
2. row ***************************!

Using index!
3. row ***************************!

www.percona.com
Why Not Second Star?
• Not possible to create a second-star index here.
• The order of the join column isn t necessarily the
same as the order of the sort column:

+---------+--------------------------+!
| id
| name
|!
+---------+--------------------------+!
| 127817 | Connery, Sean
|!
| 201693 | Lazenby, George
|!
| 213877 | Moore, Roger
|!
| 228614 | Dalton, Timothy
|!
| 581060 | Brosnan, Pierce
|!
| 707448 | Craig, Daniel
|!
+---------+--------------------------+!
www.percona.com
Lesson #3

tidy up 
indexes
you don’t
need.	

www.percona.com
Indexes You Don t Need?

create
indexes
that 
help your
queries	


and

drop
indexes
that don’t
help your
queries	

www.percona.com
Redundant Indexes

pt-duplicate-key-checker	


http://www.percona.com/doc/percona-toolkit/pt-duplicate-key-checker.html
www.percona.com
Redundant Indexes
mysql create table foo (a int, b int, 

key (a), key (b), key (a,b));!
$ pt-duplicate-key-checker h=localhost!
# #############################################################!
# test.foo
# #############################################################!
!
# a is a left-prefix of a_2!
# Key definitions:!
#
KEY `a` (`a`),!
#
KEY `a_2` (`a`,`b`)!
# Column types:!
#
! `a` int(11) default null!
#
! `b` int(11) default null!
# To remove this duplicate index, execute:!
ALTER TABLE `test`.`foo` DROP INDEX `a`;!
!
www.percona.com
Unused Indexes

pt-index-usage	


http://www.percona.com/doc/percona-toolkit/pt-index-usage.html
www.percona.com
Unused Indexes
$ sudo pt-index-usage /var/lib/mysql/mysql-slow.log!
/var/lib/mysql/mysql-slow.log: 12% 01:07 remain!
/var/lib/mysql/mysql-slow.log: 25% 00:57 remain!
/var/lib/mysql/mysql-slow.log: 37% 00:49 remain!
/var/lib/mysql/mysql-slow.log: 49% 00:41 remain!
/var/lib/mysql/mysql-slow.log: 61% 00:31 remain!
/var/lib/mysql/mysql-slow.log: 73% 00:21 remain!
/var/lib/mysql/mysql-slow.log: 84% 00:12 remain!
/var/lib/mysql/mysql-slow.log: 97% 00:02 remain!
!
. . .!
ALTER TABLE `imdb`.`cast_info` DROP KEY `movie_id`; 

-- type:non-unique!
. . .!
!

www.percona.com
Index Usage Statistics

Index Statistics
in Percona Server	


http://www.percona.com/doc/percona-server/5.5/diagnostics/user_stats.html
www.percona.com
Index Usage Statistics
• INFORMATION_SCHEMA.INDEX_STATISTICS!
• Enable with:
mysql SET GLOBAL userstat = ON;!

• Statistics are cleared when you restart mysqld.
• Negligible performance impact:
• 

http://www.mysqlperformanceblog.com/2012/06/02/how-expensive-isuser_statistics/

www.percona.com
Index Usage Statistics
• Find indexes that were never used:
mysql SELECT CONCAT(

!'ALTER TABLE `', s.table_schema, '`.`', s.table_name,

!' DROP KEY `', s.index_name, '`;') AS ddl 

FROM INFORMATION_SCHEMA.STATISTICS AS s 

LEFT OUTER JOIN INFORMATION_SCHEMA.INDEX_STATISTICS AS i 

!USING (table_schema, table_name, index_name) 

WHERE s.table_schema = 'imdb' AND i.rows_read IS NULL;!
+---------------------------------------------------------+!
| ddl
|!
+---------------------------------------------------------+!
| ALTER TABLE `imdb`.`cast_info DROP KEY `movie_id`;
|!
| ALTER TABLE `imdb`.`cast_info DROP KEY `person_id`;
|!
| ALTER TABLE `imdb`.`comp_cast_type DROP KEY `kind`;
|!
| ALTER TABLE `imdb`.`company_type DROP KEY `kind`;
|!
. . .!

www.percona.com
Lesson #4

make it a
habit.	

www.percona.com
Review Queries Regularly
• Repeat the query analysis periodically:
•  As new application code introduces new queries.
•  As the volume of data grows, making trivial queries
more expensive.

•  As site traffic changes, making some queries more
frequent.

www.percona.com
Review Queries Regularly
• Track query types you have reviewed before:
•  pt-query-digest

--review
Saves query types to a table, so you can add notes
to them, mark them as reviewed, omit them from
future reports.

•  pt-query-digest

--review-history
Saves query performance statistics to a table, so you
can analyze trends in the data over time.

www.percona.com
Review Indexes Regularly
• Run pt-duplicate-key-checker periodically:
•  After schema changes.
•  You can run this on a development or test instance.

www.percona.com
Review Indexes Regularly
• Run pt-index-usage or review

INDEX_STATISTICS periodically:

•  On a regular schedule (e.g. weekly).
•  Especially after application code changes.

www.percona.com
Lessons Redux

identify
queries.	


rate your
indexes.	


tidy up.	


make it a
habit.	

www.percona.com
Percona Training for MySQL

Senior Industry Experts
In-Person and Online Classes
Custom Onsite Training
http://percona.com/training
www.percona.com
“Rate This Session”	

	

http://www.percona.com/live/mysql-conference-2013/
sessions/how-design-indexes-really 	


www.percona.com
SQL Antipatterns: 

Avoiding the Pitfalls of
Database Programming	


by Bill Karwin	

	

Available in print, epub, mobi, pdf. 
Delivery options for Kindle or Dropbox.	

	

http://pragprog.com/book/bksqla/	

	


www.percona.com
License and Copyright
Copyright 2012-2013 Bill Karwin
www.slideshare.net/billkarwin
Released under a Creative Commons 3.0 License:
http://creativecommons.org/licenses/by-nc-nd/3.0/
You are free to share - to copy, distribute and
transmit this work, under the following conditions:

Attribution. 
You must attribute this work
to Bill Karwin.	


Noncommercial. 
No Derivative Works. 
You may not use this work for You may not alter, transform, or
commercial purposes.	

build upon this work.	

www.percona.com

Weitere ähnliche Inhalte

Was ist angesagt?

Java Linked List Tutorial | Edureka
Java Linked List Tutorial |  EdurekaJava Linked List Tutorial |  Edureka
Java Linked List Tutorial | EdurekaEdureka!
 
MySQL: Indexing for Better Performance
MySQL: Indexing for Better PerformanceMySQL: Indexing for Better Performance
MySQL: Indexing for Better Performancejkeriaki
 
Why Use EXPLAIN FORMAT=JSON?
 Why Use EXPLAIN FORMAT=JSON?  Why Use EXPLAIN FORMAT=JSON?
Why Use EXPLAIN FORMAT=JSON? Sveta Smirnova
 
B trees and_b__trees
B trees and_b__treesB trees and_b__trees
B trees and_b__treesmeghu123
 
MySQL 8.0 Optimizer Guide
MySQL 8.0 Optimizer GuideMySQL 8.0 Optimizer Guide
MySQL 8.0 Optimizer GuideMorgan Tocker
 
Indexing the MySQL Index: Key to performance tuning
Indexing the MySQL Index: Key to performance tuningIndexing the MySQL Index: Key to performance tuning
Indexing the MySQL Index: Key to performance tuningOSSCube
 
How to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better PerformanceHow to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better Performanceoysteing
 
Indexing and Performance Tuning
Indexing and Performance TuningIndexing and Performance Tuning
Indexing and Performance TuningMongoDB
 
Big Data with MySQL
Big Data with MySQLBig Data with MySQL
Big Data with MySQLIvan Zoratti
 
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...Databricks
 
Selection sort and insertion sort
Selection sort and insertion sortSelection sort and insertion sort
Selection sort and insertion sortMay Ann Mendoza
 
MySQL Optimizer Cost Model
MySQL Optimizer Cost ModelMySQL Optimizer Cost Model
MySQL Optimizer Cost ModelOlav Sandstå
 

Was ist angesagt? (20)

Java Linked List Tutorial | Edureka
Java Linked List Tutorial |  EdurekaJava Linked List Tutorial |  Edureka
Java Linked List Tutorial | Edureka
 
How to Design Indexes, Really
How to Design Indexes, ReallyHow to Design Indexes, Really
How to Design Indexes, Really
 
MySQL: Indexing for Better Performance
MySQL: Indexing for Better PerformanceMySQL: Indexing for Better Performance
MySQL: Indexing for Better Performance
 
Why Use EXPLAIN FORMAT=JSON?
 Why Use EXPLAIN FORMAT=JSON?  Why Use EXPLAIN FORMAT=JSON?
Why Use EXPLAIN FORMAT=JSON?
 
B trees and_b__trees
B trees and_b__treesB trees and_b__trees
B trees and_b__trees
 
MySQL 8.0 Optimizer Guide
MySQL 8.0 Optimizer GuideMySQL 8.0 Optimizer Guide
MySQL 8.0 Optimizer Guide
 
Indexing the MySQL Index: Key to performance tuning
Indexing the MySQL Index: Key to performance tuningIndexing the MySQL Index: Key to performance tuning
Indexing the MySQL Index: Key to performance tuning
 
How to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better PerformanceHow to Analyze and Tune MySQL Queries for Better Performance
How to Analyze and Tune MySQL Queries for Better Performance
 
Trie Data Structure
Trie Data StructureTrie Data Structure
Trie Data Structure
 
Algorithm and Programming (Searching)
Algorithm and Programming (Searching)Algorithm and Programming (Searching)
Algorithm and Programming (Searching)
 
Indexing and Performance Tuning
Indexing and Performance TuningIndexing and Performance Tuning
Indexing and Performance Tuning
 
Big Data with MySQL
Big Data with MySQLBig Data with MySQL
Big Data with MySQL
 
The PostgreSQL Query Planner
The PostgreSQL Query PlannerThe PostgreSQL Query Planner
The PostgreSQL Query Planner
 
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...
Graph Features in Spark 3.0: Integrating Graph Querying and Algorithms in Spa...
 
Selection sort and insertion sort
Selection sort and insertion sortSelection sort and insertion sort
Selection sort and insertion sort
 
Lecture8 data structure(graph)
Lecture8 data structure(graph)Lecture8 data structure(graph)
Lecture8 data structure(graph)
 
Linear Search Presentation
Linear Search PresentationLinear Search Presentation
Linear Search Presentation
 
Sql subquery
Sql  subquerySql  subquery
Sql subquery
 
Expression trees
Expression treesExpression trees
Expression trees
 
MySQL Optimizer Cost Model
MySQL Optimizer Cost ModelMySQL Optimizer Cost Model
MySQL Optimizer Cost Model
 

Ähnlich wie How to Design Indexes, Really

Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)Ontico
 
MYSQL Query Anti-Patterns That Can Be Moved to Sphinx
MYSQL Query Anti-Patterns That Can Be Moved to SphinxMYSQL Query Anti-Patterns That Can Be Moved to Sphinx
MYSQL Query Anti-Patterns That Can Be Moved to SphinxPythian
 
We Don't Need Roads: A Developers Look Into SQL Server Indexes
We Don't Need Roads: A Developers Look Into SQL Server IndexesWe Don't Need Roads: A Developers Look Into SQL Server Indexes
We Don't Need Roads: A Developers Look Into SQL Server IndexesRichie Rump
 
Tools and Techniques for Index Design
Tools and Techniques for Index DesignTools and Techniques for Index Design
Tools and Techniques for Index DesignMYXPLAIN
 
Mysql query optimization
Mysql query optimizationMysql query optimization
Mysql query optimizationBaohua Cai
 
Building better SQL Server Databases
Building better SQL Server DatabasesBuilding better SQL Server Databases
Building better SQL Server DatabasesColdFusionConference
 
Optimizing MySQL Queries
Optimizing MySQL QueriesOptimizing MySQL Queries
Optimizing MySQL QueriesAchievers Tech
 
SqlDay 2018 - Brief introduction into SQL Server Execution Plans
SqlDay 2018 - Brief introduction into SQL Server Execution PlansSqlDay 2018 - Brief introduction into SQL Server Execution Plans
SqlDay 2018 - Brief introduction into SQL Server Execution PlansMarek Maśko
 
MySQL Query Optimisation 101
MySQL Query Optimisation 101MySQL Query Optimisation 101
MySQL Query Optimisation 101Federico Razzoli
 
Database indexing techniques
Database indexing techniquesDatabase indexing techniques
Database indexing techniquesahmadmughal0312
 
P9 speed of-light faceted search via oracle in-memory option by alexander tok...
P9 speed of-light faceted search via oracle in-memory option by alexander tok...P9 speed of-light faceted search via oracle in-memory option by alexander tok...
P9 speed of-light faceted search via oracle in-memory option by alexander tok...Alexander Tokarev
 
Oracle Course
Oracle CourseOracle Course
Oracle Courserspaike
 
Presto Meetup 2016 Small Start
Presto Meetup 2016 Small StartPresto Meetup 2016 Small Start
Presto Meetup 2016 Small StartHiroshi Toyama
 
PostgreSQL - It's kind've a nifty database
PostgreSQL - It's kind've a nifty databasePostgreSQL - It's kind've a nifty database
PostgreSQL - It's kind've a nifty databaseBarry Jones
 
How to Think Like the SQL Server Engine
How to Think Like the SQL Server EngineHow to Think Like the SQL Server Engine
How to Think Like the SQL Server EngineBrent Ozar
 
MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14Eli Aschkenasy
 
ORM or SQL? A Better Way to Query in MySQL
ORM or SQL? A Better Way to Query in MySQLORM or SQL? A Better Way to Query in MySQL
ORM or SQL? A Better Way to Query in MySQLMatthew Barlocker
 
Database optimization
Database optimizationDatabase optimization
Database optimizationEsraaAlattar1
 

Ähnlich wie How to Design Indexes, Really (20)

Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
Работа с индексами - лучшие практики для MySQL 5.6, Петр Зайцев (Percona)
 
Mentor Your Indexes
Mentor Your IndexesMentor Your Indexes
Mentor Your Indexes
 
MYSQL Query Anti-Patterns That Can Be Moved to Sphinx
MYSQL Query Anti-Patterns That Can Be Moved to SphinxMYSQL Query Anti-Patterns That Can Be Moved to Sphinx
MYSQL Query Anti-Patterns That Can Be Moved to Sphinx
 
We Don't Need Roads: A Developers Look Into SQL Server Indexes
We Don't Need Roads: A Developers Look Into SQL Server IndexesWe Don't Need Roads: A Developers Look Into SQL Server Indexes
We Don't Need Roads: A Developers Look Into SQL Server Indexes
 
Tools and Techniques for Index Design
Tools and Techniques for Index DesignTools and Techniques for Index Design
Tools and Techniques for Index Design
 
Mysql query optimization
Mysql query optimizationMysql query optimization
Mysql query optimization
 
Tech talk
Tech talkTech talk
Tech talk
 
Building better SQL Server Databases
Building better SQL Server DatabasesBuilding better SQL Server Databases
Building better SQL Server Databases
 
Optimizing MySQL Queries
Optimizing MySQL QueriesOptimizing MySQL Queries
Optimizing MySQL Queries
 
SqlDay 2018 - Brief introduction into SQL Server Execution Plans
SqlDay 2018 - Brief introduction into SQL Server Execution PlansSqlDay 2018 - Brief introduction into SQL Server Execution Plans
SqlDay 2018 - Brief introduction into SQL Server Execution Plans
 
MySQL Query Optimisation 101
MySQL Query Optimisation 101MySQL Query Optimisation 101
MySQL Query Optimisation 101
 
Database indexing techniques
Database indexing techniquesDatabase indexing techniques
Database indexing techniques
 
P9 speed of-light faceted search via oracle in-memory option by alexander tok...
P9 speed of-light faceted search via oracle in-memory option by alexander tok...P9 speed of-light faceted search via oracle in-memory option by alexander tok...
P9 speed of-light faceted search via oracle in-memory option by alexander tok...
 
Oracle Course
Oracle CourseOracle Course
Oracle Course
 
Presto Meetup 2016 Small Start
Presto Meetup 2016 Small StartPresto Meetup 2016 Small Start
Presto Meetup 2016 Small Start
 
PostgreSQL - It's kind've a nifty database
PostgreSQL - It's kind've a nifty databasePostgreSQL - It's kind've a nifty database
PostgreSQL - It's kind've a nifty database
 
How to Think Like the SQL Server Engine
How to Think Like the SQL Server EngineHow to Think Like the SQL Server Engine
How to Think Like the SQL Server Engine
 
MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14MySQL Integral DB Design #JAB14
MySQL Integral DB Design #JAB14
 
ORM or SQL? A Better Way to Query in MySQL
ORM or SQL? A Better Way to Query in MySQLORM or SQL? A Better Way to Query in MySQL
ORM or SQL? A Better Way to Query in MySQL
 
Database optimization
Database optimizationDatabase optimization
Database optimization
 

Mehr von MYXPLAIN

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksMYXPLAIN
 
Need for Speed: MySQL Indexing
Need for Speed: MySQL IndexingNeed for Speed: MySQL Indexing
Need for Speed: MySQL IndexingMYXPLAIN
 
Advanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisAdvanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisMYXPLAIN
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index CookbookMYXPLAIN
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningMYXPLAIN
 
Are You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesAre You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesMYXPLAIN
 
MySQL 5.6 Performance
MySQL 5.6 PerformanceMySQL 5.6 Performance
MySQL 5.6 PerformanceMYXPLAIN
 
56 Query Optimization
56 Query Optimization56 Query Optimization
56 Query OptimizationMYXPLAIN
 
Powerful Explain in MySQL 5.6
Powerful Explain in MySQL 5.6Powerful Explain in MySQL 5.6
Powerful Explain in MySQL 5.6MYXPLAIN
 
Optimizing Queries with Explain
Optimizing Queries with ExplainOptimizing Queries with Explain
Optimizing Queries with ExplainMYXPLAIN
 
The Power of MySQL Explain
The Power of MySQL ExplainThe Power of MySQL Explain
The Power of MySQL ExplainMYXPLAIN
 
Improving Performance with Better Indexes
Improving Performance with Better IndexesImproving Performance with Better Indexes
Improving Performance with Better IndexesMYXPLAIN
 
Explaining the MySQL Explain
Explaining the MySQL ExplainExplaining the MySQL Explain
Explaining the MySQL ExplainMYXPLAIN
 
Covering indexes
Covering indexesCovering indexes
Covering indexesMYXPLAIN
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer OverviewMYXPLAIN
 
Advanced query optimization
Advanced query optimizationAdvanced query optimization
Advanced query optimizationMYXPLAIN
 

Mehr von MYXPLAIN (16)

Query Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New TricksQuery Optimization with MySQL 5.6: Old and New Tricks
Query Optimization with MySQL 5.6: Old and New Tricks
 
Need for Speed: MySQL Indexing
Need for Speed: MySQL IndexingNeed for Speed: MySQL Indexing
Need for Speed: MySQL Indexing
 
Advanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and AnalysisAdvanced Query Optimizer Tuning and Analysis
Advanced Query Optimizer Tuning and Analysis
 
MySQL Index Cookbook
MySQL Index CookbookMySQL Index Cookbook
MySQL Index Cookbook
 
Advanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema TuningAdvanced MySQL Query and Schema Tuning
Advanced MySQL Query and Schema Tuning
 
Are You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL IndexesAre You Getting the Best of your MySQL Indexes
Are You Getting the Best of your MySQL Indexes
 
MySQL 5.6 Performance
MySQL 5.6 PerformanceMySQL 5.6 Performance
MySQL 5.6 Performance
 
56 Query Optimization
56 Query Optimization56 Query Optimization
56 Query Optimization
 
Powerful Explain in MySQL 5.6
Powerful Explain in MySQL 5.6Powerful Explain in MySQL 5.6
Powerful Explain in MySQL 5.6
 
Optimizing Queries with Explain
Optimizing Queries with ExplainOptimizing Queries with Explain
Optimizing Queries with Explain
 
The Power of MySQL Explain
The Power of MySQL ExplainThe Power of MySQL Explain
The Power of MySQL Explain
 
Improving Performance with Better Indexes
Improving Performance with Better IndexesImproving Performance with Better Indexes
Improving Performance with Better Indexes
 
Explaining the MySQL Explain
Explaining the MySQL ExplainExplaining the MySQL Explain
Explaining the MySQL Explain
 
Covering indexes
Covering indexesCovering indexes
Covering indexes
 
MySQL Optimizer Overview
MySQL Optimizer OverviewMySQL Optimizer Overview
MySQL Optimizer Overview
 
Advanced query optimization
Advanced query optimizationAdvanced query optimization
Advanced query optimization
 

Kürzlich hochgeladen

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity PlanDatabarracks
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Farhan Tariq
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxLoriGlavin3
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfMounikaPolabathina
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demoHarshalMandlekar2
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfIngrid Airi González
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Hiroshi SHIBATA
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfNeo4j
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesThousandEyes
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024BookNet Canada
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 

Kürzlich hochgeladen (20)

How to write a Business Continuity Plan
How to write a Business Continuity PlanHow to write a Business Continuity Plan
How to write a Business Continuity Plan
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...Genislab builds better products and faster go-to-market with Lean project man...
Genislab builds better products and faster go-to-market with Lean project man...
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptxUse of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
Use of FIDO in the Payments and Identity Landscape: FIDO Paris Seminar.pptx
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
What is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdfWhat is DBT - The Ultimate Data Build Tool.pdf
What is DBT - The Ultimate Data Build Tool.pdf
 
Sample pptx for embedding into website for demo
Sample pptx for embedding into website for demoSample pptx for embedding into website for demo
Sample pptx for embedding into website for demo
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Generative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdfGenerative Artificial Intelligence: How generative AI works.pdf
Generative Artificial Intelligence: How generative AI works.pdf
 
Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024Long journey of Ruby standard library at RubyConf AU 2024
Long journey of Ruby standard library at RubyConf AU 2024
 
Connecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdfConnecting the Dots for Information Discovery.pdf
Connecting the Dots for Information Discovery.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyesAssure Ecommerce and Retail Operations Uptime with ThousandEyes
Assure Ecommerce and Retail Operations Uptime with ThousandEyes
 
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
New from BookNet Canada for 2024: Loan Stars - Tech Forum 2024
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 

How to Design Indexes, Really

  • 1. How to Design Indexes, Really Bill Karwin, Percona Inc.
  • 2. It’s About Performance • What s the most frequent recommendation in database performance audits? • What s the easiest way to speed up SQL queries, without schema changes or code changes? • What s a commonly neglected part of database development and maintenance? indexes. www.percona.com
  • 4. Index Shotgun Indexes improve performance, so I index every column. www.percona.com
  • 5. Index Shotgun • Many such indexes are never used. • Indexes occupy space on disk in memory buffers. • Each index needs to be modified during INSERT, UPDATE, DELETE. • Query optimizer considers indexes during every query, more indexes makes this work harder. www.percona.com
  • 6. Index Aversion Indexes have overhead, so I never create any indexes. www.percona.com
  • 7. Index Aversion • The right indexes are crucial to speed up queries. • Most workloads are read-heavy, so the net benefit of indexes outweighs the overhead of updating. • Indexes are compact, so they are a more efficient use of buffer memory. www.percona.com
  • 8. SQL Aversion I use a NoSQL database because it just works. * (* after I create the right indexes.) www.percona.com
  • 9. SQL Aversion • Many non-relational databases require you to define indexes explicitly too. • The ANSI/ISO SQL standard doesn t specify anything about indexes. • So if you want to use NoSQL, just use indexes! :-) www.percona.com
  • 10. Naive Questions Here s my schema... what indexes do I need? Copyright 2012 Gene Ontology Consortium http://www.geneontology.org/ www.percona.com
  • 11. Naive Questions • Index choice depends on... •  What tables and columns you need to query •  What JOINs you need to perform •  What GROUP BY s and ORDER BY s you need • Index design is not implicit from table design. www.percona.com
  • 12. Lesson #1 relational schema design is based on data. but index design is based on queries. www.percona.com
  • 13. Where Are the Queries? • Slow query log • General query log • Application logging • Tcpdump • Binary log • Process list www.percona.com
  • 14. Collecting Log of Queries • Enable slow-query log: mysql SET GLOBAL slow_query_log = ON;! • Include all queries, not just those that are slow: mysql SET GLOBAL long_query_time = 0;! • Percona Server can log more information: mysql SET GLOBAL log_slow_verbosity = 'full';! www.percona.com
  • 16. pt-query-digest • Analyzes your query log. • Reports the queries accounting for greatest load. •  Slow queries. •  Quick queries that run frequently. • Outputs a ranked list of top query patterns. $ pt-query-digest 
 /var/lib/mysql/mysql-slow.log 
 ~/pqd.txt! www.percona.com
  • 17. Ranked Queries # Profile! # Rank Query ID # ==== ================== # 1 0xA8D2BBDE7EBE7822 # 2 0xFE25DAF5DBB71F49 # 3 0x70DAC639802CA233 # 4 0xE336B880F4FEC4B8 # 5 0x60550B93960F1837 # 6 0xF46D5C09B4E0CA2F # 7 0x09FCFFF0E5BC929F # 8 0x9433950BE12B9470 # 9 0x4DC0E044996DA715 # 10 0x09FB72D72ED18E93 ! Response time =============== 4932.2992 28.8% 4205.2160 24.6% 1299.6269 7.6% 1184.5101 6.9% 905.1648 5.3% 777.2446 4.5% 747.4346 4.4% 744.1755 4.4% 448.5637 2.6% 361.1904 2.1% Calls ===== 78 130 14 294 60 16340 130 14368 130 78 R/Call ======= 63.2346 32.3478 92.8305 4.0289 15.0861 0.0476 5.7495 0.0518 3.4505 4.6306 Apdx V/M ==== ===== 0.00 5.22 0.00 3.47 0.00 0.17 0.36 2.29 0.05 1.33 1.00 0.17 0.53 7.69 1.00 0.18 0.65 8.31 0.28 1.89 Item! =======! SELECT person_info! SELECT title! SELECT cast_info! SELECT cast_info! SELECT name! SELECT char_name! SELECT name! SELECT name! SELECT title! SELECT cast_info title! www.percona.com
  • 18. Slow Queries # Profile! # Rank Query ID # ==== ================== # 1 0xA8D2BBDE7EBE7822 # 2 0xFE25DAF5DBB71F49 # 3 0x70DAC639802CA233 # 4 0xE336B880F4FEC4B8 # 5 0x60550B93960F1837 # 6 0xF46D5C09B4E0CA2F # 7 0x09FCFFF0E5BC929F # 8 0x9433950BE12B9470 # 9 0x4DC0E044996DA715 # 10 0x09FB72D72ED18E93 ! Response time =============== 4932.2992 28.8% 4205.2160 24.6% 1299.6269 7.6% 1184.5101 6.9% 905.1648 5.3% 777.2446 4.5% 747.4346 4.4% 744.1755 4.4% 448.5637 2.6% 361.1904 2.1% Calls ===== 78 130 14 294 60 16340 130 14368 130 78 R/Call ======= 63.2346 32.3478 92.8305 4.0289 15.0861 0.0476 5.7495 0.0518 3.4505 4.6306 Apdx V/M ==== ===== 0.00 5.22 0.00 3.47 0.00 0.17 0.36 2.29 0.05 1.33 1.00 0.17 0.53 7.69 1.00 0.18 0.65 8.31 0.28 1.89 Item! =======! SELECT person_info! SELECT title! SELECT cast_info! SELECT cast_info! SELECT name! SELECT char_name! SELECT name! SELECT name! SELECT title! SELECT cast_info title! this query executed a few times, but each takes over 1 minute www.percona.com
  • 19. Quick Queries # Profile! # Rank Query ID # ==== ================== # 1 0xA8D2BBDE7EBE7822 # 2 0xFE25DAF5DBB71F49 # 3 0x70DAC639802CA233 # 4 0xE336B880F4FEC4B8 # 5 0x60550B93960F1837 # 6 0xF46D5C09B4E0CA2F # 7 0x09FCFFF0E5BC929F # 8 0x9433950BE12B9470 # 9 0x4DC0E044996DA715 # 10 0x09FB72D72ED18E93 ! Response time =============== 4932.2992 28.8% 4205.2160 24.6% 1299.6269 7.6% 1184.5101 6.9% 905.1648 5.3% 777.2446 4.5% 747.4346 4.4% 744.1755 4.4% 448.5637 2.6% 361.1904 2.1% Calls ===== 78 130 14 294 60 16340 130 14368 130 78 R/Call ======= 63.2346 32.3478 92.8305 4.0289 15.0861 0.0476 5.7495 0.0518 3.4505 4.6306 Apdx V/M ==== ===== 0.00 5.22 0.00 3.47 0.00 0.17 0.36 2.29 0.05 1.33 1.00 0.17 0.53 7.69 1.00 0.18 0.65 8.31 0.28 1.89 Item! =======! SELECT person_info! SELECT title! SELECT cast_info! SELECT cast_info! SELECT name! SELECT char_name! SELECT name! SELECT name! SELECT title! SELECT cast_info title! another query executed frequently, each call is quick www.percona.com
  • 20. Understanding Indexes by Analogy www.percona.com
  • 21. This is a Telephone Book • A telephone book is like an index sorted by last name first, first name last. • Also includes the person s phone number. Thomas Siencki http://en.wikipedia.org/wiki/File:Telefonbog_ubt-1.JPG www.percona.com
  • 22. Implementation • In MySQL syntax, this would look like the following: CREATE INDEX phone_idx ON TelephoneBook 
 (last_name, first_name, phone_number);! www.percona.com
  • 23. Simple Searches • Since the index is pre-sorted, it benefits queries for last name: SELECT * FROM TelephoneBook 
 WHERE last_name = 'Smith';! • By benefit, we mean that it helps to narrow down the search quickly, because the entries are already in sorted order. www.percona.com
  • 24. Compound Searches • The sort order benefits us further if we search on last name and first name together: SELECT * FROM TelephoneBook 
 WHERE last_name = 'Smith' 
 AND first_name = 'John';! www.percona.com
  • 25. When the Index Fails • But if we search only on first_name, the sort order doesn t help: SELECT * FROM TelephoneBook 
 WHERE first_name = 'John';! • The John entries occur throughout the book, in an unpredictable distribution. Anyone s first name can be John . We have to search every page of the book. www.percona.com
  • 26. Order Matters • From this, we conclude that the order we define the columns in an index matters. • An index with the columns declared in the opposite order would benefit a search for first name alone, but then it wouldn t help a search for last name alone. CREATE INDEX phone_idx2 ON TelephoneBook 
 (first_name, last_name, phone_number);! www.percona.com
  • 27. Both Indexes Can Be Helpful • If both criteria use equality comparisons, then the order of columns shouldn t matter. • Either index would benefit a query that searches for a specific value in both columns. SELECT * FROM TelephoneBook 
 WHERE last_name = 'Smith' 
 AND first_name = 'John';! www.percona.com
  • 28. Range Comparisons • Searching for multiple names is another case. • An index still helps us to narrow the search even if we search for all names that match a pattern: SELECT * FROM TelephoneBook 
 WHERE last_name LIKE 'S%';! • The book groups all the names starting with S together, so the index can help us to avoid reading the whole book. www.percona.com
  • 29. Compound Range Comparisons • If we search by a range of last names, but a specific first name, then the first names are again distributed in an unpredictable way among the matching last names: SELECT * FROM TelephoneBook 
 WHERE last_name LIKE 'S%' 
 AND first_name = 'John';! • The John entries are not grouped together among all S names, so we have to search manually every S name to find the ones we want. www.percona.com
  • 30. Order Matters • From this we see that once we do a range comparison on a column in an index, any criteria we have for subsequent columns cannot benefit from the index. CREATE INDEX phone_idx ON TelephoneBook 
 (last_name, first_name, phone_number);! this column in the index helps the range search but then subsequent columns do not help searching www.percona.com
  • 31. Sorting by Index • Since the telephone book is pre-sorted, we can rely on this if we need to read through the entries in that order. SELECT * FROM TelephoneBook 
 WHERE last_name = 'Smith'
 ORDER BY first_name;! • There s no extra work to do here; we can simply read the entries in the order they are naturally written in the book. •  So the ORDER BY is a no-op. www.percona.com
  • 32. When the Index Can t Help Sorting • Sorting by any other column is another story. SELECT * FROM TelephoneBook 
 WHERE last_name = 'Smith'
 ORDER BY phone_number;! • The book is already ordered by last name and then by first name, but not numerically by phone number. • To get the result sorted in the manner above, we could copy the Smith entries onto sticky notes, then re-order the sticky notes by phone number manually. www.percona.com
  • 33. Order Matters • From this, we conclude that an index helps if we sort by the column immediately following the columns in the search criteria. • But if we need to sort by another column later in the index, or by a column that isn t in the index at all, we have to do it the hard way. www.percona.com
  • 34. Index-Only Searches • Once we find the matching entries, we may need other fields of information: SELECT phone_number 
 FROM TelephoneBook 
 WHERE last_name = 'Smith' 
 AND first_name = 'John';! • Because the phone number is included in the index entry, we get it for free. The entry includes all three fields, even if our query didn t search for the phone number explicitly. www.percona.com
  • 35. When the Index Can t Help • If we need other information that isn t included in the index, we may need to do extra work. SELECT business_hours 
 FROM TelephoneBook 
 WHERE last_name = 'Smith Plumbing';! • In this case, we d have to use the phone number of the business, and call them to ask their hours. •  That s the extra work. www.percona.com
  • 36. Columns Matter • From this, we conclude that putting columns in an index can be very important for certain queries, even if that query doesn t use the columns for searching or sorting. • This is called a covering index. www.percona.com
  • 37. Lesson #2 rate your indexes using the star system. www.percona.com
  • 38. The Star System • Rate an index with respect to a given query by three stars which describe effectiveness. • This technique is covered in Relational Database Index Design and the Optimizers by Tapio Lahdenmäki and Michael Leach. •  http://www.wiley.com/WileyCDA/WileyTitle/ productCd-0471719994.html www.percona.com
  • 39. The Star System ★ First star: The index sorts the rows so the ones you want are found together in a single group. ★ Second star: Rows referenced by your query are ordered in the index the way you want them. ★ Third star: The index contains all columns referenced by your query (covering index). www.percona.com
  • 40. Look at this Terrible Query mysql EXPLAIN SELECT person_id, person_role_id FROM cast_info 
 WHERE movie_id = 91280 AND role_id = 1 
 ORDER BY nr_order ASCG! ! scans whole table id: 1! select_type: SIMPLE! uses no index table: cast_info! type: ALL! scans a lot of rows possible_keys: NULL! key: NULL! sorts the hard way key_len: NULL! ref: NULL! rows: 24008907! Extra: Using where; Using filesort! www.percona.com
  • 41. ★ First Star ★ Pick all columns from equality predicates. Define the index with these columns first. SELECT person_id, person_role_id 
 FROM cast_info 
 WHERE movie_id = 91280 AND role_id = 1 
 ORDER BY nr_order ASC;! equality predicates ALTER TABLE cast_info ADD INDEX (movie_id, role_id);! www.percona.com
  • 42. ★ Second Star ★ Add the column(s) in the GROUP BY clause, if the query has one. BY or ORDER SELECT person_id, person_role_id 
 FROM cast_info 
 WHERE movie_id = 91280 AND role_id = 1 
 ORDER BY nr_order ASC;! sorting column ALTER TABLE cast_info ADD INDEX (movie_id, role_id, nr_order);! www.percona.com
  • 43. ★ Third Star ★ Add any remaining columns referenced in the SELECT list. SELECT person_id, person_role_id 
 FROM cast_info 
 WHERE movie_id = 91280 AND role_id = 1 
 ORDER BY nr_order ASC;! select-list columns ALTER TABLE cast_info ADD INDEX (movie_id, role_id, nr_order, person_id, person_role_id);! www.percona.com
  • 44. Explain That mysql EXPLAIN SELECT person_id, person_role_id FROM cast_info 
 WHERE movie_id = 91280 AND role_id = 1 
 ORDER BY nr_order ASCG! ! ★1: effective index id: 1! select_type: SIMPLE! ★2: no filesort table: cast_info! type: ref! possible_keys: movie_id! key: movie_id! ★3: covering index key_len: 8! ref: const,const! rows: 57! Extra: Using where; Using index! www.percona.com
  • 45. Complications • Can t achieve First-Star indexes when: •  WHERE clause has more complex expressions including OR predicates (disjunction). SELECT * FROM TelephoneBook
 WHERE last_name = 'Smith' 
 OR first_name = 'John'! disjunction www.percona.com
  • 46. Complications • Can t achieve Second-Star indexes when: •  WHERE clause includes range predicates (, , !=, NOT IN, BETWEEN, LIKE, etc.). •  Query includes both GROUP BY and ORDER BY referencing different columns. •  Query must sort by multiple columns over different tables (can t make a single index span tables). •  Query includes ORDER BY in a different order than the order in which rows are accessed. www.percona.com
  • 47. Complications • Can t achieve Third-Star indexes when: •  Query requires more columns than the maximum of 16 columns per index. •  Query requires BLOB, TEXT, or VARCHAR columns longer than the maximum of 1000 bytes per index (utf8 counts three bytes per character). www.percona.com
  • 49. Example Query mysql EXPLAIN SELECT STRAIGHT_JOIN n.* 
 FROM char_name AS c 
 INNER JOIN cast_info AS i 
 !ON c.id=i.person_role_id 
 INNER JOIN name AS n 
 !ON i.person_id=n.id 
 WHERE c.name = 'James Bond'
 ORDER BY n.nameG! char_name! cast_info! name! www.percona.com
  • 50. Not Optimized *************************** id: 1! select_type: SIMPLE! table: c! type: ALL! possible_keys: PRIMARY! key: NULL! key_len: NULL! ref: NULL! rows: 2402968! Extra: Using where; *************************** id: 1! select_type: SIMPLE! table: i! type: index! possible_keys: person_id! key: person_id! key_len: 9! ref: NULL! rows: 21676661! Extra: Using where; *************************** id: 1! select_type: SIMPLE! table: n! type: eq_ref! 1. row ***************************! 2.4 million × 21.7 million = 52 trillion comparisons Using temporary; Using filesort! 2. row ***************************! Using index; Using join buffer! 3. row ***************************! www.percona.com
  • 51. Add Indexes ★ First-star index: mysql ALTER TABLE char_name 
 ADD INDEX n (name(20));! ★ Third-star index: mysql ALTER TABLE cast_info 
 ADD INDEX pr_p (person_role_id, person_id);! char_name! cast_info! name! www.percona.com
  • 52. Optimized *************************** id: 1! select_type: SIMPLE! table: c! type: ref! possible_keys: PRIMARY,n! key: n! key_len: 62! ref: const! rows: 1! Extra: Using where; *************************** id: 1! select_type: SIMPLE! table: i! type: ref! possible_keys: pr_p! key: pr_p! key_len: 5! ref: imdb.c.id! rows: 108383! Extra: Using where; *************************** id: 1! select_type: SIMPLE! table: n! type: eq_ref! 1. row ***************************! improved by a factor of 480 million! Using temporary; Using filesort! 2. row ***************************! Using index! 3. row ***************************! www.percona.com
  • 53. Why Not Second Star? • Not possible to create a second-star index here. • The order of the join column isn t necessarily the same as the order of the sort column: +---------+--------------------------+! | id | name |! +---------+--------------------------+! | 127817 | Connery, Sean |! | 201693 | Lazenby, George |! | 213877 | Moore, Roger |! | 228614 | Dalton, Timothy |! | 581060 | Brosnan, Pierce |! | 707448 | Craig, Daniel |! +---------+--------------------------+! www.percona.com
  • 54. Lesson #3 tidy up indexes you don’t need. www.percona.com
  • 55. Indexes You Don t Need? create indexes that help your queries and drop indexes that don’t help your queries www.percona.com
  • 57. Redundant Indexes mysql create table foo (a int, b int, 
 key (a), key (b), key (a,b));! $ pt-duplicate-key-checker h=localhost! # #############################################################! # test.foo # #############################################################! ! # a is a left-prefix of a_2! # Key definitions:! # KEY `a` (`a`),! # KEY `a_2` (`a`,`b`)! # Column types:! # ! `a` int(11) default null! # ! `b` int(11) default null! # To remove this duplicate index, execute:! ALTER TABLE `test`.`foo` DROP INDEX `a`;! ! www.percona.com
  • 59. Unused Indexes $ sudo pt-index-usage /var/lib/mysql/mysql-slow.log! /var/lib/mysql/mysql-slow.log: 12% 01:07 remain! /var/lib/mysql/mysql-slow.log: 25% 00:57 remain! /var/lib/mysql/mysql-slow.log: 37% 00:49 remain! /var/lib/mysql/mysql-slow.log: 49% 00:41 remain! /var/lib/mysql/mysql-slow.log: 61% 00:31 remain! /var/lib/mysql/mysql-slow.log: 73% 00:21 remain! /var/lib/mysql/mysql-slow.log: 84% 00:12 remain! /var/lib/mysql/mysql-slow.log: 97% 00:02 remain! ! . . .! ALTER TABLE `imdb`.`cast_info` DROP KEY `movie_id`; 
 -- type:non-unique! . . .! ! www.percona.com
  • 60. Index Usage Statistics Index Statistics in Percona Server http://www.percona.com/doc/percona-server/5.5/diagnostics/user_stats.html www.percona.com
  • 61. Index Usage Statistics • INFORMATION_SCHEMA.INDEX_STATISTICS! • Enable with: mysql SET GLOBAL userstat = ON;! • Statistics are cleared when you restart mysqld. • Negligible performance impact: •  http://www.mysqlperformanceblog.com/2012/06/02/how-expensive-isuser_statistics/ www.percona.com
  • 62. Index Usage Statistics • Find indexes that were never used: mysql SELECT CONCAT(
 !'ALTER TABLE `', s.table_schema, '`.`', s.table_name,
 !' DROP KEY `', s.index_name, '`;') AS ddl 
 FROM INFORMATION_SCHEMA.STATISTICS AS s 
 LEFT OUTER JOIN INFORMATION_SCHEMA.INDEX_STATISTICS AS i 
 !USING (table_schema, table_name, index_name) 
 WHERE s.table_schema = 'imdb' AND i.rows_read IS NULL;! +---------------------------------------------------------+! | ddl |! +---------------------------------------------------------+! | ALTER TABLE `imdb`.`cast_info DROP KEY `movie_id`; |! | ALTER TABLE `imdb`.`cast_info DROP KEY `person_id`; |! | ALTER TABLE `imdb`.`comp_cast_type DROP KEY `kind`; |! | ALTER TABLE `imdb`.`company_type DROP KEY `kind`; |! . . .! www.percona.com
  • 63. Lesson #4 make it a habit. www.percona.com
  • 64. Review Queries Regularly • Repeat the query analysis periodically: •  As new application code introduces new queries. •  As the volume of data grows, making trivial queries more expensive. •  As site traffic changes, making some queries more frequent. www.percona.com
  • 65. Review Queries Regularly • Track query types you have reviewed before: •  pt-query-digest --review Saves query types to a table, so you can add notes to them, mark them as reviewed, omit them from future reports. •  pt-query-digest --review-history Saves query performance statistics to a table, so you can analyze trends in the data over time. www.percona.com
  • 66. Review Indexes Regularly • Run pt-duplicate-key-checker periodically: •  After schema changes. •  You can run this on a development or test instance. www.percona.com
  • 67. Review Indexes Regularly • Run pt-index-usage or review INDEX_STATISTICS periodically: •  On a regular schedule (e.g. weekly). •  Especially after application code changes. www.percona.com
  • 68. Lessons Redux identify queries. rate your indexes. tidy up. make it a habit. www.percona.com
  • 69. Percona Training for MySQL Senior Industry Experts In-Person and Online Classes Custom Onsite Training http://percona.com/training www.percona.com
  • 71. SQL Antipatterns: Avoiding the Pitfalls of Database Programming by Bill Karwin Available in print, epub, mobi, pdf. Delivery options for Kindle or Dropbox. http://pragprog.com/book/bksqla/ www.percona.com
  • 72. License and Copyright Copyright 2012-2013 Bill Karwin www.slideshare.net/billkarwin Released under a Creative Commons 3.0 License: http://creativecommons.org/licenses/by-nc-nd/3.0/ You are free to share - to copy, distribute and transmit this work, under the following conditions: Attribution. You must attribute this work to Bill Karwin. Noncommercial. No Derivative Works. You may not use this work for You may not alter, transform, or commercial purposes. build upon this work. www.percona.com