---
sidebar: heading
title: SQLä¼åç¸å
³é¢è¯é¢
category: æ°æ®åº
tag:
- MySQL
head:
- - meta
- name: keywords
content: MySQLé¢è¯é¢,SQLä¼å,æ
¢æ¥è¯¢ä¼å,ç´¢å¼å¤±æ,MySQLæ§è¡è®¡å
- - meta
- name: description
content: SQLä¼å常è§ç¥è¯ç¹åé¢è¯é¢æ»ç»ï¼è®©å¤©ä¸æ²¡æé¾èçå
«è¡æï¼
---
## èèexplainæ§è¡è®¡å
ä½¿ç¨ explain è¾åº SELECT è¯å¥æ§è¡ç详ç»ä¿¡æ¯ï¼å
æ¬ä»¥ä¸ä¿¡æ¯ï¼
- 表çå 载顺åº
- sql çæ¥è¯¢ç±»å
- å¯è½ç¨å°åªäºç´¢å¼ï¼å®é
ä¸ç¨å°åªäºç´¢å¼
- 读åçè¡æ°
`Explain` æ§è¡è®¡åå
å«å段信æ¯å¦ä¸ï¼å嫿¯ `id`ã`select_type`ã`table`ã`partitions`ã`type`ã`possible_keys`ã`key`ã`key_len`ã`ref`ã`rows`ã`filtered`ã`Extra` 12ä¸ªåæ®µã
éè¿explain extended + show warningså¯ä»¥å¨åæ¬explainçåºç¡ä¸é¢å¤æä¾ä¸äºæ¥è¯¢ä¼åçä¿¡æ¯ï¼å¾å°ä¼å以åçå¯è½çæ¥è¯¢è¯å¥ï¼ä¸ä¸å®æ¯æç»ä¼åçç»æï¼ã
å
æå»ºæµè¯ç¯å¢ï¼
```sql
CREATE TABLE `blog` (
`blog_id` int NOT NULL AUTO_INCREMENT COMMENT 'å¯ä¸åæid--主é®',
`blog_title` varchar(255) NOT NULL COMMENT 'åææ é¢',
`blog_body` text NOT NULL COMMENT 'åæå
容',
`blog_time` datetime NOT NULL COMMENT 'åæå叿¶é´',
`update_time` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
`blog_state` int NOT NULL COMMENT 'åæç¶æ--0 å é¤ 1æ£å¸¸',
`user_id` int NOT NULL COMMENT 'ç¨æ·id',
PRIMARY KEY (`blog_id`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8
CREATE TABLE `user` (
`user_id` int NOT NULL AUTO_INCREMENT COMMENT 'ç¨æ·å¯ä¸id--主é®',
`user_name` varchar(30) NOT NULL COMMENT 'ç¨æ·å--ä¸è½éå¤',
`user_password` varchar(255) NOT NULL COMMENT 'ç¨æ·å¯ç ',
PRIMARY KEY (`user_id`),
KEY `name` (`user_name`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=utf8
CREATE TABLE `discuss` (
`discuss_id` int NOT NULL AUTO_INCREMENT COMMENT 'è¯è®ºå¯ä¸id',
`discuss_body` varchar(255) NOT NULL COMMENT 'è¯è®ºå
容',
`discuss_time` datetime NOT NULL COMMENT 'è¯è®ºæ¶é´',
`user_id` int NOT NULL COMMENT 'ç¨æ·id',
`blog_id` int NOT NULL COMMENT 'åæid',
PRIMARY KEY (`discuss_id`)
) ENGINE=InnoDB AUTO_INCREMENT=61 DEFAULT CHARSET=utf8
```
**id**
表示æ¥è¯¢ä¸æ§è¡selectå奿è
æä½è¡¨ç顺åºï¼**`id`çå¼è¶å¤§ï¼ä»£è¡¨ä¼å
级è¶é«ï¼è¶å
æ§è¡**ã
```mysql
explain select discuss_body
from discuss
where blog_id = (
select blog_id from blog where user_id = (
select user_id from user where user_name = 'admin'));
```
ä¸ä¸ªè¡¨ä¾æ¬¡åµå¥ï¼åç°æéå±çåæ¥è¯¢ `id`æå¤§ï¼æå
æ§è¡ã

**select_type**
表示 `select` æ¥è¯¢çç±»åï¼ä¸»è¦æ¯ç¨äºåºååç§å¤æçæ¥è¯¢ï¼ä¾å¦ï¼`æ®éæ¥è¯¢`ã`èåæ¥è¯¢`ã`åæ¥è¯¢`çã
1. SIMPLEï¼è¡¨ç¤ºæç®åç select æ¥è¯¢è¯å¥ï¼å¨æ¥è¯¢ä¸ä¸å
å«åæ¥è¯¢æè
交并差éçæä½ã
2. PRIMARYï¼æ¥è¯¢ä¸æå¤å±çSELECTï¼åå¨åæ¥è¯¢çå¤å±ç表æä½ä¸ºPRIMARYï¼ã
3. SUBQUERYï¼åæ¥è¯¢ä¸é¦ä¸ªSELECTã
4. DERIVEDï¼è¢«é©±å¨çSELECTåæ¥è¯¢ï¼åæ¥è¯¢ä½äºFROMåå¥ï¼ã
5. UNIONï¼å¨SELECTä¹å使ç¨äºUNIONã
**table**
æ¥è¯¢ç表åï¼å¹¶ä¸ä¸å®æ¯çå®åå¨çè¡¨ï¼æå«åæ¾ç¤ºå«åï¼ä¹å¯è½ä¸ºä¸´æ¶è¡¨ãå½fromåå¥ä¸æåæ¥è¯¢æ¶ï¼table忝 ``çæ ¼å¼ï¼è¡¨ç¤ºå½åæ¥è¯¢ä¾èµ id为Nçæ¥è¯¢ï¼ä¼å
æ§è¡ id为Nçæ¥è¯¢ã

**partitions**
æ¥è¯¢æ¶å¹é
å°çååºä¿¡æ¯ï¼å¯¹äºéååºè¡¨å¼ä¸º`NULL`ï¼å½æ¥è¯¢çæ¯ååºè¡¨æ¶ï¼`partitions`æ¾ç¤ºååºè¡¨å½ä¸çååºæ
åµã

**type**
æ¥è¯¢ä½¿ç¨äºä½ç§ç±»åï¼å®å¨ `SQL`ä¼å䏿¯ä¸ä¸ªé常éè¦çææ ã
**system**
å½è¡¨ä»
æä¸è¡è®°å½æ¶ï¼ç³»ç»è¡¨ï¼ï¼æ°æ®éå¾å°ï¼å¾å¾ä¸éè¦è¿è¡ç£çIOï¼é度éå¸¸å¿«ãæ¯å¦ï¼Mysqlç³»ç»è¡¨proxies_privå¨Mysqlæå¡å¯å¨æ¶åå·²ç»å è½½å¨å
åä¸ï¼å¯¹è¿ä¸ªè¡¨è¿è¡æ¥è¯¢ä¸éè¦è¿è¡ç£ç IOã

**const**
å表æä½çæ¶åï¼æ¥è¯¢ä½¿ç¨äºä¸»é®æè
å¯ä¸ç´¢å¼ã

**eq_ref**
**å¤è¡¨å
³è**æ¥è¯¢çæ¶åï¼ä¸»é®åå¯ä¸ç´¢å¼ä½ä¸ºå
³èæ¡ä»¶ãå¦ä¸å¾çsqlï¼å¯¹äºuser表ï¼å¤å¾ªç¯ï¼çæ¯ä¸è¡ï¼user_role表ï¼å
循ç¯ï¼åªæä¸è¡æ»¡è¶³joinæ¡ä»¶ï¼åªè¦æ¥æ¾å°è¿è¡è®°å½ï¼å°±ä¼è·³åºå
循ç¯ï¼ç»§ç»å¤å¾ªç¯çä¸ä¸è½®æ¥è¯¢ã

**ref**
æ¥æ¾æ¡ä»¶å使ç¨äºç´¢å¼èä¸ä¸ä¸ºä¸»é®åå¯ä¸ç´¢å¼ãè½ç¶ä½¿ç¨äºç´¢å¼ï¼ä½è¯¥ç´¢å¼åçå¼å¹¶ä¸å¯ä¸ï¼è¿æ ·å³ä½¿ä½¿ç¨ç´¢å¼æ¥æ¾å°äºç¬¬ä¸æ¡æ°æ®ï¼ä»ç¶ä¸è½åæ¢ï¼è¦å¨ç®æ å¼éè¿è¿è¡å°èå´æ«æãä½å®ç好夿¯ä¸éè¦æ«å
¨è¡¨ï¼å ä¸ºç´¢å¼æ¯æåºçï¼å³ä¾¿æéå¤å¼ï¼ä¹æ¯å¨ä¸ä¸ªé常å°çèå´å
åæ«æã

**ref_or_null**
类似 refï¼ä¼é¢å¤æç´¢å
å«`NULL`å¼çè¡ã
**index_merge**
使ç¨äºç´¢å¼åå¹¶ä¼åæ¹æ³ï¼æ¥è¯¢ä½¿ç¨äºä¸¤ä¸ªä»¥ä¸çç´¢å¼ãæ°å»ºcomment表ï¼id为主é®ï¼value_id为éå¯ä¸ç´¢å¼ï¼æ§è¡`explain select content from comment where value_id = 1181000 and id > 1000;`ï¼æ§è¡ç»ææ¾ç¤ºæ¥è¯¢åæ¶ä½¿ç¨äºidåvalue_idç´¢å¼ï¼typeåçå¼ä¸ºindex_mergeã

**range**
æèå´çç´¢å¼æ«æï¼ç¸å¯¹äºindexçå
¨ç´¢å¼æ«æï¼å®æèå´éå¶ï¼å æ¤è¦ä¼äºindexãåbetweenãandã'>'ã'<'ãinåor齿¯èå´ç´¢å¼æ«æã

**index**
indexå
æ¬selectç´¢å¼åï¼order by主é®ä¸¤ç§æ
åµã
1. order by主é®ãè¿ç§æ
åµä¼æç
§ç´¢å¼é¡ºåºå
¨è¡¨æ«ææ°æ®ï¼æ¿å°çæ°æ®æ¯æç
§ä¸»é®æå¥½åºçï¼ä¸éè¦é¢å¤è¿è¡æåºã

2. selectç´¢å¼åãtype为indexï¼èä¸extraåæ®µä¸ºusing indexï¼ä¹ç§°è¿ç§æ
åµä¸ºç´¢å¼è¦çãæéè¦åçæ°æ®é½å¨ç´¢å¼åï¼æ éå表æ¥è¯¢ã

**all**
å
¨è¡¨æ«æï¼æ¥è¯¢æ²¡æç¨å°ç´¢å¼ï¼æ§è½æå·®ã

**possible_keys**
æ¤æ¬¡æ¥è¯¢ä¸å¯è½éç¨çç´¢å¼ã**ä½è¿ä¸ªç´¢å¼å¹¶ä¸å®ä¸ä¼æ¯æç»æ¥è¯¢æ°æ®æ¶æè¢«ç¨å°çç´¢å¼**ã
**key**
æ¤æ¬¡æ¥è¯¢ä¸ç¡®å使ç¨å°çç´¢å¼ã
**ref**
`ref` åæ¾ç¤ºä½¿ç¨åªä¸ªåæå¸¸æ°ä¸`key`ä¸èµ·ä»è¡¨ä¸éæ©æ°æ®è¡ã常è§ç弿`const`ã`func`ã`NULL`ãå
·ä½å段åãå½ `key` å为 `NULL`ï¼å³ä¸ä½¿ç¨ç´¢å¼æ¶ã妿弿¯`func`ï¼å使ç¨ç弿¯æä¸ªå½æ°çç»æã
以ä¸SQLçæ§è¡è®¡å`ref`为`const`ï¼å 为使ç¨äºç»åç´¢å¼`(user_id, blog_id)`ï¼`where user_id = 13`ä¸13为常éã
```mysql
mysql> explain select blog_id from user_like where user_id = 13;
+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------------+
| 1 | SIMPLE | user_like | NULL | ref | ul1,ul2 | ul1 | 4 | const | 2 | 100.00 | Using index |
+----+-------------+-----------+------------+------+---------------+------+---------+-------+------+----------+-------------+
```
èä¸é¢è¿ä¸ªSQLçæ§è¡è®¡å`ref`å¼ä¸º`NULL`ï¼å 为`key`为`NULL`ï¼æ¥è¯¢æ²¡æç¨å°ç´¢å¼ã
```mysql
mysql> explain select user_id from user_like where status = 1;
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
| 1 | SIMPLE | user_like | NULL | ALL | NULL | NULL | NULL | NULL | 6 | 16.67 | Using where |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------------+
```
**rows**
ä¼°ç®è¦æ¾å°æéçè®°å½ï¼éè¦è¯»åçè¡æ°ãè¯ä¼°`SQL` æ§è½çä¸ä¸ªæ¯è¾éè¦çæ°æ®ï¼`mysql`éè¦æ«æçè¡æ°ï¼å¾ç´è§çæ¾ç¤º `SQL` æ§è½ç好åï¼ä¸è¬æ
åµä¸ `rows` å¼è¶å°è¶å¥½ã
**filtered**
åå¨å¼æè¿åçæ°æ®å¨ç»è¿è¿æ»¤åï¼å©ä¸æ»¡è¶³æ¡ä»¶çè®°å½æ°éçæ¯ä¾ã
**extra**
表示é¢å¤çä¿¡æ¯è¯´æãä¸ºäºæ¹ä¾¿æµè¯ï¼è¿éæ°å»ºä¸¤å¼ 表ã
```sql
CREATE TABLE `t_order` (
`id` int NOT NULL AUTO_INCREMENT,
`user_id` int DEFAULT NULL,
`order_id` int DEFAULT NULL,
`order_status` tinyint DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_userid_order_id_createdate` (`user_id`,`order_id`,`create_date`)
) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8
CREATE TABLE `t_orderdetail` (
`id` int NOT NULL AUTO_INCREMENT,
`order_id` int DEFAULT NULL,
`product_name` varchar(100) DEFAULT NULL,
`cnt` int DEFAULT NULL,
`create_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `idx_orderid_productname` (`order_id`,`product_name`)
) ENGINE=InnoDB AUTO_INCREMENT=152 DEFAULT CHARSET=utf8
```
**1.using where**
æ¥è¯¢çåæªè¢«ç´¢å¼è¦çï¼whereç鿡件éç´¢å¼çå导åã对åå¨å¼æè¿åçç»æè¿è¡è¿æ»¤ï¼Post-filterï¼åè¿æ»¤ï¼ï¼ä¸è¬åçå¨MySQLæå¡å¨ï¼è䏿¯åå¨å¼æå±ã

**2.using index**
æ¥è¯¢çå被索å¼è¦çï¼å¹¶ä¸whereçéæ¡ä»¶ç¬¦åæå·¦åç¼ååï¼éè¿**ç´¢å¼æ¥æ¾**å°±è½ç´æ¥æ¾å°ç¬¦åæ¡ä»¶çæ°æ®ï¼ä¸éè¦å表æ¥è¯¢æ°æ®ã

**3.Using where&Using index**
æ¥è¯¢çå被索å¼è¦çï¼ä½æ æ³éè¿ç´¢å¼æ¥æ¾æ¾å°ç¬¦åæ¡ä»¶çæ°æ®ï¼ä¸è¿å¯ä»¥éè¿**ç´¢å¼æ«æ**æ¾å°ç¬¦åæ¡ä»¶çæ°æ®ï¼ä¹ä¸éè¦å表æ¥è¯¢æ°æ®ã
å
æ¬ä¸¤ç§æ
åµï¼ç»åç´¢å¼ä¸º(user_id, orde)ï¼ï¼
- whereç鿡件ä¸ç¬¦åæå·¦åç¼åå

- whereç鿡件æ¯ç´¢å¼åå导åçä¸ä¸ªèå´

**4.null**
æ¥è¯¢çåæªè¢«ç´¢å¼è¦çï¼å¹¶ä¸whereç鿡件æ¯ç´¢å¼çå导åï¼ä¹å°±æ¯ç¨å°äºç´¢å¼ï¼ä½æ¯é¨ååæ®µæªè¢«ç´¢å¼è¦çï¼å¿
é¡»å表æ¥è¯¢è¿äºå段ï¼Extraä¸ä¸ºNULLã

**5.using index condition**
ç´¢å¼ä¸æ¨ï¼index condition pushdownï¼ICPï¼ï¼å
使ç¨whereæ¡ä»¶è¿æ»¤ç´¢å¼ï¼è¿æ»¤å®ç´¢å¼åæ¾å°ææç¬¦åç´¢å¼æ¡ä»¶çæ°æ®è¡ï¼éåç¨ WHERE åå¥ä¸çå
¶ä»æ¡ä»¶å»è¿æ»¤è¿äºæ°æ®è¡ã
ä¸ä½¿ç¨ICPçæ
åµï¼`set optimizer_switch='index_condition_pushdown=off'`ï¼ï¼å¦ä¸å¾ï¼å¨æ¥éª¤4ä¸ï¼æ²¡æä½¿ç¨whereæ¡ä»¶è¿æ»¤ç´¢å¼ï¼

使ç¨ICPçæ
åµï¼`set optimizer_switch='index_condition_pushdown=on'`ï¼ï¼

ä¸é¢çä¾å使ç¨äºICPï¼
```sql
explain select user_id, order_id, order_status
from t_order where user_id > 1 and user_id < 5\G;
```

å
³æICPä¹åï¼`set optimizer_switch='index_condition_pushdown=off'`ï¼ï¼å¯ä»¥çå°extraå为using whereï¼ä¸ä¼ä½¿ç¨ç´¢å¼ä¸æ¨ã

**6.using temporary**
使ç¨äºä¸´æ¶è¡¨ä¿åä¸é´ç»æï¼å¸¸è§äº order by å group by ä¸ãå
¸åçï¼å½group byåorder byåæ¶åå¨ï¼ä¸ä½ç¨äºä¸åçåæ®µæ¶ï¼å°±ä¼å»ºç«ä¸´æ¶è¡¨ï¼ä»¥ä¾¿è®¡ç®åºæç»çç»æéã
**7.filesort**
æä»¶æåºãè¡¨ç¤ºæ æ³å©ç¨ç´¢å¼å®ææåºæä½ï¼ä»¥ä¸æ
åµä¼å¯¼è´filesortï¼
- order by çåæ®µä¸æ¯ç´¢å¼å段
- select æ¥è¯¢å段ä¸å
¨æ¯ç´¢å¼å段
- select æ¥è¯¢åæ®µé½æ¯ç´¢å¼å段ï¼ä½æ¯ order by åæ®µåç´¢å¼å段ç顺åºä¸ä¸è´

**8.using join buffer**
Block Nested Loopï¼éè¦è¿è¡åµå¥å¾ªç¯è®¡ç®ã两个å
³è表joinï¼å
³èåæ®µåæªå»ºç«ç´¢å¼ï¼å°±ä¼åºç°è¿ç§æ
åµãæ¯å¦å
å±åå¤å±çtypeå为ALLï¼rowså为4ï¼éè¦å¾ªç¯è¿è¡4*4次计ç®ã常è§çä¼åæ¹æ¡æ¯ï¼å¨å
³èåæ®µä¸æ·»å ç´¢å¼ï¼é¿å
æ¯æ¬¡åµå¥å¾ªç¯è®¡ç®ã
## 大表æ¥è¯¢æ
¢æä¹ä¼åï¼
æä¸ªè¡¨æè¿å䏿°æ®ï¼æ¥è¯¢æ¯è¾æ
¢ï¼å¦ä½ä¼åï¼
å½MySQLåè¡¨è®°å½æ°è¿å¤§æ¶ï¼æ°æ®åºçæ§è½ä¼ææ¾ä¸éï¼ä¸äºå¸¸è§çä¼åæªæ½å¦ä¸ï¼
* åç建ç«ç´¢å¼ãå¨åéçåæ®µä¸å»ºç«ç´¢å¼ï¼ä¾å¦å¨WHEREåORDER BYå½ä»¤ä¸æ¶åçå建ç«ç´¢å¼ï¼å¯æ ¹æ®EXPLAINæ¥æ¥çæ¯å¦ç¨äºç´¢å¼è¿æ¯å
¨è¡¨æ«æ
* ç´¢å¼ä¼åï¼SQLä¼åãæå·¦å¹é
ååçï¼åèï¼https://topjavaer.cn/database/mysql.html#%E4%BB%80%E4%B9%88%E6%98%AF%E8%A6%86%E7%9B%96%E7%B4%A2%E5%BC%95
* 建ç«ååºã对å
³é®åæ®µå»ºç«æ°´å¹³ååºï¼æ¯å¦æ¶é´å段ï¼è¥æ¥è¯¢æ¡ä»¶å¾å¾éè¿æ¶é´èå´æ¥è¿è¡æ¥è¯¢ï¼è½æåä¸å°æ§è½
* å©ç¨ç¼åãå©ç¨Redisçç¼åçç¹æ°æ®ï¼æé«æ¥è¯¢æç
* é宿°æ®çèå´ãæ¯å¦ï¼ç¨æ·å¨æ¥è¯¢åå²ä¿¡æ¯çæ¶åï¼å¯ä»¥æ§å¶å¨ä¸ä¸ªæçæ¶é´èå´å
* 读åå离ãç»å
¸çæ°æ®åºæåæ¹æ¡ï¼ä¸»åºè´è´£åï¼ä»åºè´è´£è¯»
* éè¿ååºåè¡¨çæ¹å¼è¿è¡ä¼åï¼ä¸»è¦æåç´æååæ°´å¹³æå
* åç建ç«ç´¢å¼ãå¨åéçåæ®µä¸å»ºç«ç´¢å¼ï¼ä¾å¦å¨WHEREåORDERBYå½ä»¤ä¸æ¶åçå建ç«ç´¢å¼
7. æ°æ®å¼æå°es
8. å·çæ°æ®å离ãå 个æä¹åä¸å¸¸ç¨çæ°æ®æ¾å°å·åºä¸ï¼ææ°çæ°æ®æ¯è¾æ°çæ°æ®æ¾å°çåºä¸
9. åçº§æ°æ®åºç±»åï¼æ¢ä¸ç§è½å
¼å®¹MySQLçæ°æ®åºï¼OceanBaseãtidbï¼
## æ·±å页æä¹ä¼åï¼
è¿æ¯ä»¥ä¸é¢çSQL为空ï¼`select * from xxx order by id limit 500000, 10;`
**æ¹æ³ä¸**ï¼
ä»ä¸é¢çåæå¯ä»¥çåºï¼å½offseté常大æ¶ï¼serverå±ä¼ä»å¼æå±è·åå°å¾å¤æ ç¨çæ°æ®ï¼èå½selectå颿¯*å·æ¶ï¼å°±éè¦æ·è´å®æ´çè¡ä¿¡æ¯ï¼**æ·è´å®æ´æ°æ®**ç¸æ¯**åªæ·è´è¡æ°æ®éçå
¶ä¸ä¸ä¸¤ä¸ªååæ®µ**æ´èè´¹æ¶é´ã
å 为åé¢çoffsetæ¡æ°æ®æå齿¯ä¸è¦çï¼æ²¡æå¿
è¦æ·è´å®æ´åæ®µï¼æä»¥å¯ä»¥å°sqlè¯å¥ä¿®æ¹æï¼
```
select * from xxx where id >=(select id from xxx order by id limit 500000, 1) order by id limit 10;
```
å
æ§è¡åæ¥è¯¢ `select id from xxx by id limit 500000, 1`, è¿ä¸ªæä½ï¼å
¶å®ä¹æ¯å°å¨innodbä¸ç主é®ç´¢å¼ä¸è·åå°`500000+1`æ¡æ°æ®ï¼ç¶åserverå±ä¼æå¼å500000æ¡ï¼åªä¿çæå䏿¡æ°æ®çidã
ä½ä¸åçå°æ¹å¨äºï¼å¨è¿åserverå±çè¿ç¨ä¸ï¼åªä¼æ·è´æ°æ®è¡å
çidè¿ä¸åï¼èä¸ä¼æ·è´æ°æ®è¡çææåï¼å½æ°æ®éè¾å¤§æ¶ï¼è¿é¨åçèæ¶è¿æ¯æ¯è¾ææ¾çã
卿¿å°äºä¸é¢çidä¹åï¼å设è¿ä¸ªidæ£å¥½çäº500000ï¼é£sqlå°±åæäº
```
select * from xxx where id >=500000 order by id limit 10;
```
è¿æ ·innodbåèµ°ä¸æ¬¡**主é®ç´¢å¼**ï¼éè¿B+æ å¿«éå®ä½å°id=500000çè¡æ°æ®ï¼æ¶é´å¤æåº¦æ¯lg(n)ï¼ç¶åååå10æ¡æ°æ®ã
**æ¹æ³äºï¼**
å°ææçæ°æ®**æ ¹æ®id主é®è¿è¡æåº**ï¼ç¶ååæ¹æ¬¡åï¼å°å½åæ¹æ¬¡çæå¤§idä½ä¸ºä¸æ¬¡çéçæ¡ä»¶è¿è¡æ¥è¯¢ã
```mysql
select * from xxx where id > start_id order by id limit 10;
```
éè¿ä¸»é®ç´¢å¼ï¼æ¯æ¬¡å®ä½å°start_idçä½ç½®ï¼ç¶åå¾åéå10ä¸ªæ°æ®ï¼è¿æ ·ä¸ç®¡æ°æ®å¤å¤§ï¼æ¥è¯¢æ§è½é½è¾ä¸ºç¨³å®ã
## 导è´MySQLæ
¢æ¥è¯¢æåªäºåå ï¼
1. 没æç´¢å¼ï¼æè
ç´¢å¼å¤±æã
2. åè¡¨æ°æ®é太大
3. æ¥è¯¢ä½¿ç¨äºä¸´æ¶è¡¨
4. join æè
åæ¥è¯¢è¿å¤
5. inå
ç´ è¿å¤ãå¦æä½¿ç¨äºinï¼å³ä½¿åé¢çæ¡ä»¶å äºç´¢å¼ï¼è¿æ¯è¦æ³¨æinåé¢çå
ç´ ä¸è¦è¿å¤åãinå
ç´ ä¸è¬å»ºè®®ä¸è¦è¶
è¿500个ï¼å¦æè¶
è¿äºï¼å»ºè®®åç»ï¼æ¯æ¬¡500ä¸ç»è¿è¡ã
## ç´¢å¼ä»ä¹æ¶åä¼å¤±æï¼
导è´ç´¢å¼å¤±æçæ
åµï¼
- 对äºç»åç´¢å¼ï¼ä¸æ¯ä½¿ç¨ç»åç´¢å¼æå·¦è¾¹çåæ®µï¼åä¸ä¼ä½¿ç¨ç´¢å¼
- 以%å¼å¤´çlikeæ¥è¯¢å¦`%abc`ï¼æ æ³ä½¿ç¨ç´¢å¼ï¼é%å¼å¤´çlikeæ¥è¯¢å¦`abc%`ï¼ç¸å½äºèå´æ¥è¯¢ï¼ä¼ä½¿ç¨ç´¢å¼
- æ¥è¯¢æ¡ä»¶ä¸åç±»åæ¯åç¬¦ä¸²ï¼æ²¡æä½¿ç¨å¼å·ï¼å¯è½ä¼å 为类åä¸ååçéå¼è½¬æ¢ï¼ä½¿ç´¢å¼å¤±æ
- å¤æç´¢å¼åæ¯å¦ä¸çäºæä¸ªå¼æ¶
- 对索å¼åè¿è¡è¿ç®
- æ¥è¯¢æ¡ä»¶ä½¿ç¨`or`è¿æ¥ï¼ä¹ä¼å¯¼è´ç´¢å¼å¤±æ