Heim Datenbank MySQL-Tutorial 关于Index Condition Pushdown特性_MySQL

关于Index Condition Pushdown特性_MySQL

May 30, 2016 pm 05:10 PM
特性

ICP简介

Index Condition Pushdown (ICP) is an optimization for the case where MySQL retrieves rows from a table using an index. Without ICP, the storage engine traverses the index to locate rows in the base table and returns them to the MySQL server which evaluates the WHEREcondition for the rows. With ICP enabled, and if parts of the WHERE condition can be evaluated by using only fields from the index, the MySQL server pushes this part of the WHERE condition down to the storage engine. The storage engine then evaluates the pushed index condition by using the index entry and only if this is satisfied is the row read from the table. ICP can reduce the number of times the storage engine must access the base table and the number of times the MySQL server must access the storage engine.

 

也就说:利用索引(二级索引)来过滤一部分where条件

 

测试

 

导入数据库

 

wget https://launchpad.net/test-db/employees-db-1/1.0.6/+download/employees_db-full-1.0.6.tar.bz2
tar jxf employees_db-full-1.0.6.tar.bz2
cd employees_db
mysql -uroot -p < employees.sql
Nach dem Login kopieren

表结构

mysql> show create table employees \G
*************************** 1. row ***************************
       Table: employees
Create Table: CREATE TABLE `employees` (
  `emp_no` int(11) NOT NULL,
  `birth_date` date NOT NULL,
  `first_name` varchar(14) NOT NULL,
  `last_name` varchar(16) NOT NULL,
  `gender` enum(&#39;M&#39;,&#39;F&#39;) NOT NULL,
  `hire_date` date NOT NULL,
  PRIMARY KEY (`emp_no`),
  KEY `index_bh` (`birth_date`,`hire_date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
Nach dem Login kopieren

一些表数据

mysql> select @@optimizer_switch like &#39;%index_condition_pushdown%&#39; \G
*************************** 1. row ***************************
@@optimizer_switch like &#39;%index_condition_pushdown%&#39;: 1
1 row in set (0.00 sec)

mysql> select @@optimizer_switch like &#39;%index_condition_pushdown%&#39; \G
*************************** 1. row ***************************
@@optimizer_switch like &#39;%index_condition_pushdown%&#39;: 1
1 row in set (0.00 sec)

mysql> select @@query_cache_type;
+--------------------+
| @@query_cache_type |
+--------------------+
| OFF                |
+--------------------+
1 row in set (0.01 sec)

mysql> select count(*) from employees;
+----------+
| count(*) |
+----------+
|   300024 |
+----------+
1 row in set (0.17 sec)

mysql> set profiling=1;
Query OK, 0 rows affected, 1 warning (0.00 sec)
Nach dem Login kopieren

建立索引

alter table employees add index index_bh (`birth_date`,`hire_date`);

查询分析

mysql> explain select *   from employees where birth_date between &#39;1955-01-01&#39; and &#39;1955-12-31&#39; and datediff(hire_date,birth_date)>12300 and first_name like &#39;S%b%&#39;;
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+-------------+
| id | select_type | table     | type  | possible_keys | key      | key_len | ref  | rows  | Extra       |
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+-------------+
|  1 | SIMPLE      | employees | range | index_bh      | index_bh | 3       | NULL | 46318 | Using where |
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+-------------+
1 row in set (0.00 sec)

mysql> SET optimizer_switch=&#39;index_condition_pushdown=on&#39;;
Query OK, 0 rows affected (0.00 sec)

mysql> explain select *   from employees where birth_date between &#39;1955-01-01&#39; and &#39;1955-12-31&#39; and datediff(hire_date,birth_date)>12300 and first_name like &#39;S%b%&#39;;
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+------------------------------------+
| id | select_type | table     | type  | possible_keys | key      | key_len | ref  | rows  | Extra                              |
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+------------------------------------+
|  1 | SIMPLE      | employees | range | index_bh      | index_bh | 3       | NULL | 46318 | Using index condition; Using where |
+----+-------------+-----------+-------+---------------+----------+---------+------+-------+------------------------------------+
1 row in set (0.01 sec)
Nach dem Login kopieren

执行查询

mysql> show profiles;                                                                                                                 +----------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
| Query_ID | Duration   | Query                                                                                                                                                |
+----------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
|        1 | 0.00278025 | desc employees                                                                                                                                       |
|        2 | 0.00049775 | show create table employees                                                                                                                          |
|        3 | 0.07444550 | select *   from employees where birth_date between &#39;1955-01-01&#39; and &#39;1955-12-31&#39; and datediff(hire_date,birth_date)>12300 and first_name like &#39;S%b%&#39; |
|        4 | 0.00027500 | SET optimizer_switch=&#39;index_condition_pushdown=off&#39;                                                                                                  |
|        5 | 0.12347025 | select *   from employees where birth_date between &#39;1955-01-01&#39; and &#39;1955-12-31&#39; and datediff(hire_date,birth_date)>12300 and first_name like &#39;S%b%&#39; |
+----------+------------+------------------------------------------------------------------------------------------------------------------------------------------------------+
Nach dem Login kopieren

 

 

从结果可以看出来开启ICP之后确实快不少

 

启用ICP之后,可以用索引来筛选 datediff(hire_date,birth_date)>12300 记录,不需要读出整条记录

 

ICP原理

 

如下图所示(图来自MariaDB)

 

1、优化器没有使用ICP时

 

在存储引擎层,首先读取索引元组(index tuple),然后使用(index tuple)在基表中(base table)定位和读取整行数据

 

到服务器层,匹配where条件,如果该行数据满足where条件则使用,否则丢弃
 

指针向下一行移动,重复以上过程

关于Index Condition Pushdown特性_MySQL

2、使用ICP的时候

 

如果where条件的一部分能够通过使用索引中的字段进行过滤,那么服务器层将把这部分where条件Pushdown到存储引擎层

 

到存储引擎层,从索引中读取索引元组(index tuple),使用索引元组进行判断,如果没有满足where条件,则处理下一条索引元组(index tuple),只有当索引元组满足条件的时候,才会去基表中读取数据

关于Index Condition Pushdown特性_MySQL

ICP的使用条件

 

1、只能用于二级索引(secondary index)

 

2、explain显示的执行计划中type值(join 类型)为range、 ref、 eq_ref或者ref_or_null。且查询需要访问表的整行数据,即不能直接通过二级索引的元组数据获得查询结果(索引覆盖)

 

3、ICP可以用于MyISAM和InnnoDB存储引擎,不支持分区表(5.7将会解决这个问题)

 

4、ICP的加速效果取决于在存储引擎内通过ICP筛选掉的数据的比例

Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. Beste grafische Einstellungen
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. So reparieren Sie Audio, wenn Sie niemanden hören können
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Einführung in die Unterschiede zwischen der Win7-Home-Version und der Win7-Ultimate-Version Einführung in die Unterschiede zwischen der Win7-Home-Version und der Win7-Ultimate-Version Jul 12, 2023 pm 08:41 PM

Jeder weiß, dass es viele Versionen des Win7-Systems gibt, z. B. die Win7-Ultimate-Version, die Win7-Professional-Version, die Win7-Home-Version usw. Viele Benutzer sind zwischen der Home-Version und der Ultimate-Version verwickelt und wissen nicht, welche Version sie wählen sollen. Deshalb werde ich Ihnen heute die Unterschiede zwischen Win7 Family Meal und Win7 Ultimate erläutern. 1. Experience Different Home Basic Edition macht Ihre täglichen Abläufe schneller und einfacher und ermöglicht Ihnen einen schnelleren und bequemeren Zugriff auf Ihre am häufigsten verwendeten Programme und Dokumente. Home Premium bietet Ihnen das beste Unterhaltungserlebnis und macht es einfach, Ihre Lieblingsfernsehsendungen, Fotos, Videos und Musik zu genießen und zu teilen. Die Ultimate Edition integriert alle Funktionen jeder Edition und verfügt über alle Unterhaltungsfunktionen und professionellen Features von Windows 7 Home Premium.

Beherrschen Sie die Schlüsselkonzepte von Spring MVC: Verstehen Sie diese wichtigen Funktionen Beherrschen Sie die Schlüsselkonzepte von Spring MVC: Verstehen Sie diese wichtigen Funktionen Dec 29, 2023 am 09:14 AM

Verstehen Sie die Hauptfunktionen von SpringMVC: Um diese wichtigen Konzepte zu beherrschen, sind spezifische Codebeispiele erforderlich. SpringMVC ist ein Java-basiertes Framework für die Entwicklung von Webanwendungen, das Entwicklern beim Aufbau flexibler und skalierbarer Strukturen durch das Architekturmuster Model-View-Controller (MVC) hilft. Internetanwendung. Wenn wir die wichtigsten Funktionen von SpringMVC verstehen und beherrschen, können wir unsere Webanwendungen effizienter entwickeln und verwalten. In diesem Artikel werden einige wichtige Konzepte von SpringMVC vorgestellt

Was sind die drei Merkmale von 5g? Was sind die drei Merkmale von 5g? Dec 09, 2020 am 10:55 AM

Die drei Merkmale von 5g sind: 1. Hohe Geschwindigkeit; in praktischen Anwendungen ist die Geschwindigkeit des 5G-Netzwerks mehr als zehnmal so hoch wie die des 4G-Netzwerks. 2. Geringe Latenz: Die Latenz des 5G-Netzwerks beträgt etwa zehn Millisekunden und ist damit schneller als die menschliche Reaktionsgeschwindigkeit. 3. Breite Verbindung; die Entstehung des 5G-Netzwerks wird in Kombination mit anderen Technologien eine neue Szene des Internet of Everything schaffen.

Wählen Sie je nach Bedarf und Funktionen die passende Go-Version Wählen Sie je nach Bedarf und Funktionen die passende Go-Version Jan 20, 2024 am 09:28 AM

Mit der rasanten Entwicklung des Internets werden Programmiersprachen ständig weiterentwickelt und aktualisiert. Unter ihnen hat die Go-Sprache als Open-Source-Programmiersprache in den letzten Jahren große Aufmerksamkeit erregt. Die Go-Sprache ist so konzipiert, dass sie einfach, effizient, sicher und leicht zu entwickeln und bereitzustellen ist. Es zeichnet sich durch hohe Parallelität, schnelle Kompilierung und Speichersicherheit aus und wird daher häufig in Bereichen wie Webentwicklung, Cloud Computing und Big Data eingesetzt. Derzeit sind jedoch verschiedene Versionen der Go-Sprache verfügbar. Bei der Auswahl einer geeigneten Go-Sprachversion müssen wir sowohl Anforderungen als auch Funktionen berücksichtigen. Kopf

Gibt es in Golang klassenähnliche objektorientierte Funktionen? Gibt es in Golang klassenähnliche objektorientierte Funktionen? Mar 19, 2024 pm 02:51 PM

In Golang (Go-Sprache) gibt es kein Konzept einer Klasse im herkömmlichen Sinne, es stellt jedoch einen Datentyp namens Struktur bereit, durch den objektorientierte Funktionen ähnlich wie Klassen erreicht werden können. In diesem Artikel erklären wir, wie Strukturen zur Implementierung objektorientierter Funktionen verwendet werden, und stellen konkrete Codebeispiele bereit. Definition und Verwendung von Strukturen Werfen wir zunächst einen Blick auf die Definition und Verwendung von Strukturen. In Golang können Strukturen über das Schlüsselwort type definiert und dann bei Bedarf verwendet werden. Strukturen können Attribute enthalten

C++-Funktionstypen und -merkmale C++-Funktionstypen und -merkmale Apr 11, 2024 pm 03:30 PM

C++-Funktionen haben die folgenden Typen: einfache Funktionen, konstante Funktionen, statische Funktionen und virtuelle Funktionen; zu den Funktionen gehören: Inline-Funktionen, Standardparameter, Referenzrückgaben und überladene Funktionen. Beispielsweise verwendet die Funktion „calculeArea“ π, um die Fläche eines Kreises mit einem bestimmten Radius zu berechnen und gibt sie als Ausgabe zurück.

Was sind die Merkmale von Java? Was sind die Merkmale von Java? Aug 09, 2023 pm 03:05 PM

Die Merkmale von Java sind: 1. Einfach und leicht zu erlernen; 2. Objektorientiert, wodurch der Code wiederverwendbar und wartbar wird; 3. Plattformunabhängig, auf verschiedenen Betriebssystemen lauffähig; 4. Speicherverwaltung durch automatische Müllabfuhr; Sammelmechanismus: Speicher verwalten; 5. Starke Typprüfung, Variablen müssen ihren Typ vor der Verwendung deklarieren; 6. Sicherheit, die den unbefugten Zugriff und die Ausführung von Schadcode verhindern kann; Programm; 8. Ausnahmebehandlung kann Programmabstürze vermeiden; 9. Eine große Anzahl von Entwicklungsbibliotheken und Frameworks; 10. Open-Source-Ökosystem;

Beherrschen Sie die wichtigsten Funktionen und Anwendungsszenarien der Golang-Middleware Beherrschen Sie die wichtigsten Funktionen und Anwendungsszenarien der Golang-Middleware Mar 20, 2024 pm 06:33 PM

Als schnelle und effiziente Programmiersprache wird Golang auch häufig im Bereich der Webentwicklung eingesetzt. Unter anderem kann Middleware als wichtiges Entwurfsmuster Entwicklern dabei helfen, Code besser zu organisieren und zu verwalten sowie die Wiederverwendbarkeit und Wartbarkeit von Code zu verbessern. In diesem Artikel werden die wichtigsten Funktionen und Anwendungsszenarien der Middleware in Golang vorgestellt und ihre Verwendung anhand spezifischer Codebeispiele veranschaulicht. 1. Das Konzept und die Funktion von Middleware. Als Plug-In-Komponente wird Middleware in der Anforderungs-Antwort-Verarbeitungskette der Anwendung eingesetzt

See all articles