ä¸.建ç«ç´¢å¼å®éªæ°æ®
- 1.建表ï¼
#å建é¨é¨è¡¨
DROP TABLE IF EXISTS `dept`;
CREATE TABLE `dept` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`deptname` varchar(30) DEFAULT NULL COMMENT 'é¨é¨åç§°',
`address` varchar(40) DEFAULT NULL COMMENT 'å°å',
`ceo` int NULL COMMENT 'ceo',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='é¨é¨';
#å建å工表
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`empno` int NOT NULL COMMENT 'åå·¥ç¼å·',
`name` varchar(30) DEFAULT NULL COMMENT 'å§å',
`age` int(3) DEFAULT NULL COMMENT 'å¹´é¾',
`deptId` int(11) DEFAULT NULL COMMENT 'é¨é¨id',
PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='åå·¥';
- 2.åå»ºå½æ°
#éæºäº§çå符串
DROP FUNCTION IF EXISTS rand_str;
create FUNCTION rand_str(strlen INT ) RETURNS VARCHAR(255)
BEGIN
DECLARE randStr VARCHAR(255) DEFAULT 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890';
DECLARE i SMALLINT DEFAULT 0;
DECLARE resultStr VARCHAR(255) DEFAULT '';
WHILE i<strlen DO
SET resultStr=CONCAT(SUBSTR(randStr,FLOOR(RAND()*LENGTH(randStr))+1,1),resultStr);
SET i=i+1;
END WHILE;
RETURN resultStr;
END
#éæºäº§çæ°å
DROP FUNCTION IF EXISTS rand_num;
create FUNCTION rand_num (from_num INT,to_num INT ) RETURNS INT(11)
BEGIN
DECLARE i INT DEFAULT 0;
SET i=FLOOR(from_num +RAND()*(to_num -from_num+1));
RETURN i;
END
- 3.åå»ºå½æ°ï¼åå¦
æ¥éï¼This function has none of DETERMINISTIC......
#ç±äºå¼å¯è¿æ
¢æ¥è¯¢æ¥å¿ï¼å 为æä»¬å¼å¯äº bin-log, æä»¬å°±å¿
须为æä»¬çfunctionæå®ä¸ä¸ªåæ°ã
show variables like 'log_bin_trust_function_creators';
set global log_bin_trust_function_creators=1;
#è¿æ ·æ·»å äºåæ°ä»¥åï¼å¦æmysqldéå¯ï¼ä¸è¿°åæ°å伿¶å¤±ï¼æ°¸ä¹
æ¹æ³ï¼
#linuxä¸ /etc/my.cnfä¸my.cnf å ä¸
[mysqld]
log_bin_trust_function_creators=1
- 4.å建åå¨è¿ç¨
#å建å¾empè¡¨ä¸æå
¥æ°æ®çåå¨è¿ç¨
#drop PROCEDURE insert_emp;
create PROCEDURE insert_emp(start INT,max_num INT )
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i+1;
INSERT INTO emp(empno,name,age,deptid)VALUES ((START+i) ,rand_str(6) , rand_num(30,50),rand_num(1,10000));
UNTIL i =max_num
END REPEAT;
COMMIT;
END
#å建å¾deptè¡¨ä¸æå
¥æ°æ®çåå¨è¿ç¨
#drop PROCEDURE insert_dept;
create PROCEDURE insert_dept(max_num INT )
BEGIN
DECLARE i INT DEFAULT 0;
SET autocommit = 0;
REPEAT
SET i = i+1;
INSERT INTO dept(deptname,address,ceo)VALUES (rand_str(8), rand_str(10),rand_num(1,50000));
UNTIL i =max_num
END REPEAT;
COMMIT;
END
- 5.è°ç¨åå¨è¿ç¨
#æ§è¡åå¨è¿ç¨ï¼å¾dept表添å 1䏿¡æ°æ®
CALL insert_dept(10000);
#æ§è¡åå¨è¿ç¨ï¼å¾emp表添å 50䏿¡æ°æ®
CALL insert_emp(100000,500000);
äº.ç´¢å¼å¤±ææ¡ä¾
- å¦ä½å¤æç´¢å¼æ¯å¦å¤±æï¼
- æ¥çExplainå½ä»¤åæå¨ï¼éè¿
å ³é®åtypeãkeyãExtra
Mysql-索引失效、關聯查詢優化、子查詢優化、order by優化、group by優化、分頁優化 - keyï¼ä½¿ç¨å°çç´¢å¼ï¼å¦æ
为nullï¼ç´¢å¼å¤±æ
- typeï¼è®¿é®ç±»åï¼å¦æ
为allï¼ç´¢å¼å¤±æ
- Extraï¼é¢å¤ä¿¡æ¯(使ç¨çç´¢å¼è¯¦ç»ä¿¡æ¯)
使ç¨è¦çç´¢å¼çæ¶åå°±ä¼åºç°using index ï¼
卿¥æ¾ä½¿ç¨ç´¢å¼çæ åµä¸ï¼éè¦åè¡¨å»æ¥è¯¢æéçæ°æ®using whereï¼
æ¥æ¾ä½¿ç¨äºç´¢å¼ï¼ä½æ¯éè¦å表æ¥è¯¢æ°æ®using index conditionï¼
æ¥æ¾ä½¿ç¨äºç´¢å¼ï¼ä½æ¯éè¦çæ°æ®é½å¨ç´¢å¼åä¸è½æ¾å°ï¼æä»¥ä¸éè¦å表æ¥è¯¢æ°æ®using index & using whereï¼
- ä»ä¹æ åµä¸ä¼é æç´¢å¼å¤±æï¼
æªéµå¾ªæä½³å·¦åç¼æ³å
- å¨ç´¢å¼ä¸å
è®¡ç®æä½
çç´¢å¼å段ï¼(ä½èå´æ¥è¯¢ä¹åçç´¢å¼å段ä¸ä¼ç´¢å¼å¤±æ)
èå´æ¡ä»¶æ¥è¯¢å³è¾¹
- 使ç¨
(!= æè <>)
ä¸çäº
- 使ç¨
(ä½is nullä¸ä¼å¯¼è´ç´¢å¼å¤±æ)
is not null
- 使ç¨
or
(â%abcâ¦â)
like以éé 符%å¼å¤´
å符串ä¸å åå¼å·
- ç´¢å¼å¤±æå¯¹æ¯åæï¼
-
0.æªæ·»å ç´¢å¼ï¼(åå§ç¶æ)
#æ¥ç表ä¸çç´¢å¼
mysql> show index from emp ;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| emp | 0 | PRIMARY | 1 | id | A | 470526 | NULL | NULL | | BTREE | | |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
#Explainæ¥çåå§ç¶æä¸çç´¢å¼ä½¿ç¨æ
åµ
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND deptId = 4 AND NAME = 'bREJiw';
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 0.10 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
åå§ç¶æä¸çï¼åªæä¸»é®idï¼mysql é»è®¤å äºç´¢å¼ï¼ä½æä»¬çsqlè¯å¥æªä½¿ç¨å°id ï¼æ type为ALLï¼key为NULLï¼æªä½¿ç¨å°ä»»ä½ç´¢å¼
æ»ç»ï¼
-
1.æä½³ååç¼æ³å
#æ·»å ç»åç´¢å¼
CREATE INDEX idx_age_deptId_name ON emp(age,deptId,name);
#1.以ç»åç´¢å¼ç第ä¸ä¸ªå段ä½ä¸ºè¿æ»¤æ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 ;
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 5 | const | 49176 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
#2.以ç»åç´¢å¼çåä¸¤ä¸ªåæ®µä½ä¸ºè¿æ»¤æ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND deptId = 4 ;
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 10 | const,const | 3 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------+------+----------+-------+
#3.以ç»åç´¢å¼çåä¸ä¸ªå段ä½ä¸ºè¿æ»¤æ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND deptId = 4 AND NAME = 'bREJiw';
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 133 | const,const,const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
#4.å°ç»åç´¢å¼ç第ä¸ä¸ªå段ageå»é¤
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE deptId = 4 AND NAME = 'bREJiw';
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 1.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
#5.å°ç»åç´¢å¼ç第äºä¸ªå段deptIdå»é¤
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND NAME = 'bREJiw';
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-----------------------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 5 | const | 49176 | 10.00 | Using index condition |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-----------------------+
1ï¼ 1ã2ã3对æ¯ï¼é½ä½¿ç¨å°äºkeyï¼idx_age_deptId_nameï¼refï¼const(
对æ¯åæï¼
è§å¯constæ°éåwhereè¿æ»¤æ¡ä»¶çæ°éçå ³ç³»
)mï¼rowsï¼æ«æçç©çè¡æ°å¨ä¸æåå°ï¼
2ï¼ 3å4对æ¯ï¼å°ç»åç´¢å¼çé¦å段ageå»é¤å
3ï¼ 3å5对æ¯ï¼å°ç»åç´¢å¼çä¸é´å段deptIdå»é¤åï¼ref ä¸conståå°ä¸º1个ï¼Extra为Using index condition(æ¥æ¾ä½¿ç¨äºç´¢å¼ï¼ä½å表æ¥è¯¢äºæ°æ®)ï¼
(å³è·³è¿ageåæ®µ)ï¼4çç´¢å¼å¤±æäº
(å³è·³è¿äºdeptIdåæ®µï¼5ä¸çç´¢å¼åçäºä¸æï¼åªæä¸æåçageåæ®µçæï¼ageä¹åçnameåæ®µå¤±æäº)
æ»ç»ï¼
æ¥è¯¢éä»ç´¢å¼çæå·¦ååå¼å§ï¼å¹¶ä¸ä¸è·³è¿ç´¢å¼ä¸çå
-
2.ä¸å¨ç´¢å¼ä¸åæä½
#1.以ç»åç´¢å¼ç第ä¸ä¸ªå段ä½ä¸ºè¿æ»¤æ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 ;
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 5 | const | 49176 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+-------+----------+-------+
#1.å¨ç´¢å¼ä¸è®¡ç®
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age + deptId = 34 ;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
#2.å¨ç´¢å¼ä¸ä½¿ç¨å½æ°
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE abs(age) = 30 ;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 100.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
#3.使ç¨oræ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 or deptId = 4 ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 14.50 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
1ï¼ 1ã2ã3ã4对æ¯ï¼2ã3ã4ä¸çtypeï¼ALLï¼keyï¼NULLï¼ç´¢å¼é½å¤±æäº
对æ¯åæï¼
æ»ç»ï¼
ç´¢å¼ä¸ç计ç®ã彿°ãï¼èªå¨oræå¨ï¼ç±»å转æ¢ï¼ä¼å¯¼è´ç´¢å¼å¤±æè转åå ¨è¡¨æ«æ
-
3.ä¸è½ä½¿ç¨ç´¢å¼ä¸çèå´æ¡ä»¶å³è¾¹çå
#1.以ç»åç´¢å¼çåä¸ä¸ªå段ä½ä¸ºè¿æ»¤æ¡ä»¶
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND deptId = 4 AND NAME = 'bREJiw';
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 133 | const,const,const | 1 | 100.00 | NULL |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------------------+------+----------+-------+
#2.whereåçè¿æ»¤æ¡ä»¶å为èå´æ¥è¯¢
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age = 30 AND deptId > 4 AND NAME = 'bREJiw';
+----+-------------+-------+------------+-------+---------------------+---------------------+---------+------+-------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------------+---------------------+---------+------+-------+----------+-----------------------+
| 1 | SIMPLE | emp | NULL | range | idx_age_deptId_name | idx_age_deptId_name | 10 | NULL | 49088 | 10.00 | Using index condition |
+----+-------------+-------+------------+-------+---------------------+---------------------+---------+------+-------+----------+-----------------------+
1ï¼1å2 对æ¯ï¼2çtypeå为rangeï¼è¯´æä½¿ç¨äºageådeptIdçç´¢å¼ï¼ä½deptIdä¹åçç´¢å¼name失æäº
对æ¯åæï¼
æ»ç»ï¼
èå´æ¥è¯¢æ¡ä»¶å³è¾¹çç´¢å¼ä¼å¤±æ
-
4.ä¸è½ä½¿ç¨ä¸çäº
#1.ä¸çäº
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age != 30 ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
#2.大äº
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age > 30 ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
#3.å°äº
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age < 300 ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
#4.ä¸çäº
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age <> 300 ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
æ»ç»ï¼
ä¸çäºï¼ï¼=æè <>ï¼ç´¢å¼ä¼å¤±æï¼å¯¼è´å ¨è¡¨æ«æ
-
5.å¯ä»¥ä½¿ç¨is nullï¼ä¸å¯ä»¥ä½¿ç¨is not null
#1.is null
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age is null ;
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+------+----------+-----------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+------+----------+-----------------------+
| 1 | SIMPLE | emp | NULL | ref | idx_age_deptId_name | idx_age_deptId_name | 5 | const | 1 | 100.00 | Using index condition |
+----+-------------+-------+------------+------+---------------------+---------------------+---------+-------+------+----------+-----------------------+
#2.is not null
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE age is not null ;
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | idx_age_deptId_name | NULL | NULL | NULL | 499145 | 50.00 | Using where |
+----+-------------+-------+------------+------+---------------------+------+---------+------+--------+----------+-------------+
1ï¼1å2 对æ¯ï¼1ä¸çis nullç´¢å¼æªå¤±æï¼typeï¼refçåäºå¸¸éæ¥è¯¢ï¼2ä¸çç´¢å¼å¤±æäº
对æ¯åæï¼
æ»ç»ï¼
is nullç´¢å¼ä¸ä¼å¤±æï¼is not null ä¼å¯¼è´ç´¢å¼å¤±æ
-
6.like ä¸è½ä»¥éé 符å¼å¤´ï¼å¦('%abc')
#1.likeè¯å¥ä¸å«éé
符
mysql> EXPLAIN SELECT SQL_NO_CACHE age,deptId,name FROM emp WHERE name like 'abwL3q' ;
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| 1 | SIMPLE | emp | NULL | index | NULL | idx_age_deptId_name | 133 | NULL | 499145 | 11.11 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
#2.likeè¯å¥ä»¥éé
符å¼å¤´
mysql> EXPLAIN SELECT SQL_NO_CACHE * FROM emp WHERE name like '%abwL3q' ;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 11.11 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
#3.likeè¯å¥å
å«éé
符ä½ä¸ä»¥éé
符å¼å¤´
mysql> EXPLAIN SELECT SQL_NO_CACHE age,deptId,name FROM emp WHERE name like 'abw%L3q' ;
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| 1 | SIMPLE | emp | NULL | index | NULL | idx_age_deptId_name | 133 | NULL | 499145 | 11.11 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
1ï¼1ã2å3 对æ¯ï¼1å3çç´¢å¼æªå¤±æï¼2ä¸çç´¢å¼å¤±æäº
对æ¯åæï¼
æ»ç»ï¼
likeè¯å¥ä»¥éé 符%å¼å¤´çæ¥è¯¢ç´¢å¼ä¼å¤±æï¼å¯¼è´å ¨è¡¨æ«æ
-
7.å符串ä¸å åå¼å·
#1.å符串æ¥è¯¢å åå¼å·
mysql> EXPLAIN SELECT SQL_NO_CACHE id,name FROM emp WHERE name = '123' ;
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
| 1 | SIMPLE | emp | NULL | index | NULL | idx_age_deptId_name | 133 | NULL | 499145 | 10.00 | Using where; Using index |
+----+-------------+-------+------------+-------+---------------+---------------------+---------+------+--------+----------+--------------------------+
#2.å符串æ¥è¯¢ä¸å åå¼å·
mysql> EXPLAIN SELECT SQL_NO_CACHE id,name,empno FROM emp WHERE name = 123 ;
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
| 1 | SIMPLE | emp | NULL | ALL | NULL | NULL | NULL | NULL | 499145 | 10.00 | Using where |
+----+-------------+-------+------------+------+---------------+------+---------+------+--------+----------+-------------+
æ»ç»ï¼
å符串ä¸å åå¼å·ç´¢å¼ä¼å¤±æï¼å¯¼è´å ¨è¡¨æ«æ
-
ç´¢å¼å»ºè®®ï¼
-
å°½ééæ©é对å½åè¿æ»¤æ§æ´å¥½çç´¢å¼ï¼åèç´¢å¼å¤±æ1.åé®ç´¢å¼ï¼
-
å建ç»åç´¢å¼æ¶ï¼æ¥è¯¢æ¡ä»¶ä¸è¿æ»¤æ§æ´å¥½çåæ®µå¨ç»åç´¢å¼ä¸çä½ç½®è¶é åè¶å¥½ï¼æ ¹æ®æ¥è¯¢æ¡ä»¶ï¼å¯ä»¥éå½selectåæ®µé¡ºåºæwhereåæ®µé¡ºåº2.å建ç»åç´¢å¼ï¼
-
éæ©ç»åç´¢å¼æ¶ï¼å°½ééæ©å å«å½åwhereæ¡ä»¶æ´å¤å段çç´¢å¼ï¼å¦æåºç°èå´æ¥è¯¢çï¼å°½éå°èå´æ¥è¯¢æå¼èµ·ç´¢å¼å¤±æçåæ®µæ¾å°ç»åç´¢å¼çåé¢3.éæ©ç»åç´¢å¼ï¼
ä¸.å表æ¥è¯¢ä¼å
- explainåæ
-
0.æªæ·»å ç´¢å¼ï¼(åå§ç¶æ)
Mysql-索引失效、關聯查詢優化、子查詢優化、order by優化、group by優化、分頁優化 Mysql-索引失效、關聯查詢優化、子查詢優化、order by優化、group by優化、分頁優化 -
1.ä¼å-å建3åæ®µçç»åç´¢å¼
#å建3åæ®µç»åç´¢å¼ï¼whereæ¡ä»¶åæ3ä¸ªåæ®µageãempnoãnameï¼å建ç»åç´¢å¼
CREATE index idx_age_empno_name on emp(age,empno,NAME);
-
2.ä¼å-å建2åæ®µçç»åç´¢å¼
#å
å é¤å·²æçç´¢å¼
drop index idx_age_empno_name on emp ;
#å建2åæ®µç»åç´¢å¼ï¼whereæ¡ä»¶åæ2ä¸ªåæ®µageãnameï¼å建ç»åç´¢å¼(å 为empno为ä¸çäºæ¡ä»¶æ¥è¯¢ï¼ä¼å¯¼è´å
¶åçæ¥è¯¢æ¡ä»¶ç´¢å¼å¤±æï¼ç´¢å¼empnoånameæä»¬åªè½äºéä¸)
CREATE index idx_age_name on emp(age,name);
-
3.ä¼å-å建2åæ®µçç»åç´¢å¼
#å
å é¤å·²æçç´¢å¼
drop index idx_age_name on emp ;
#å建2åæ®µç»åç´¢å¼ï¼whereæ¡ä»¶åæ2ä¸ªåæ®µageãempno
CREATE index idx_age_empno on emp(age,empno);
- ä¸è¿°3ç§ç»åç´¢å¼å¯¹æ¯åæï¼
éè¿Explainæ§è¡åæå¨çåæç»æï¼ç»åç´¢å¼idx_age_name è¯å®æ¯æä¼çå 为type为ref好äºå ¶å®çrangeï¼Extraä¸ä¹æªåºç°Using filesortï¼ä½éè¿æ¥è¯¢ç»æçèæ¶æ¥è¯´å´æ¯ç»åç´¢å¼idx_age_nameèæ¶æé¿ã
为ä»ä¹ç»åç´¢å¼idx_age_nameçExplainçæææ¾ç¤ºæ¯æä¼çï¼ä½æ§è¡èæ¶å´æ¯æé¿çï¼
ææçæåºé½æ¯å¨æ¡ä»¶è¿æ»¤ä¹åææ§è¡çï¼å½50䏿¡æ°æ®è¢«è¿æ»¤æ¡ä»¶å·éä¹åï¼å¯è½å°±å ç¾æ¡æ°æ®éè¦æåºï¼è¿å ç¾æ¡æ°æ®æ¶èçæ§è½å¾å°ï¼å³ä½¿å¨æåºå段ä¸å¢å ç´¢å¼æ¥æé«æçï¼æé«ç空é´ä¹å¾å°ï¼è使ç¨empno <101000è¿ä¸ªæ¡ä»¶æªä½¿ç¨å°ç´¢å¼ï¼éè¦å¯¹å 䏿¡æ°æ®è¿è¡æ«æï¼é常æ¶èæ§è½ï¼æä»¥å¯¹è¯¥å段è¿è¡æ«ææ¯ææå¤§çæ§è½æé«ç©ºé´ç
åå ï¼
å½èå´æ¡ä»¶ågroup by æè order by çåæ®µåºç°äºé䏿¶ ï¼
ç»è®ºï¼
å¦æè¿æ»¤çæ°æ®è¶³å¤å¤ï¼èéè¦æåºçæ°æ®å¹¶ä¸å¤æ¶ï¼ä¼å æç´¢å¼æ¾å¨èå´å段ä¸ãåä¹ï¼äº¦ç¶
ä¼å è§å¯æ¡ä»¶å段çè¿æ»¤æ°éï¼
å.å ³èæ¥è¯¢ä¼å
- å建表
CREATE TABLE IF NOT EXISTS `class` ( `id` INT ( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT ( 10 ) UNSIGNED NOT NULL, PRIMARY KEY ( `id` ) );
CREATE TABLE IFNOT EXISTS `book` ( `bookid` INT ( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT, `card` INT ( 10 ) UNSIGNED NOT NULL, PRIMARY KEY ( `bookid` ) );
- æå ¥æ°æ®
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO class(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
INSERT INTO book(card) VALUES(FLOOR(1 + (RAND() * 20)));
- explainåæ
-
0.æªæ·»å ç´¢å¼ï¼(åå§ç¶æ)
-
1.ä¼å-å¨é©±å¨è¡¨class䏿·»å ç´¢å¼ååæ
-
2.ä¼å-ç»§ç»å¨è¢«é©±å¨è¡¨book䏿·»å ç´¢å¼ååæ
-
æ·»å ç´¢å¼åå对æ¯åæï¼
æä»¬åæçunionæ¥è¯¢ä¸ºï¼å ¶ä¸class为驱å¨è¡¨ï¼book为被驱å¨è¡¨ï¼éè¿å¯¹æ¯åç°å¨æ·»å idx_card_bookåæ§è½æææ¾æåãè¿æ¯ç±å·¦è¿æ¥çç¹æ§å³å®çï¼
class LEFT JOIN book ON class.card = book.card
ï¼ææå°±ä¼æclass 表çrowsä¸è®ºæä»¬æä¹ä¼åå ¶rowsé½ä¸åï¼æä»¥æä»¬åªè½ä¼åå³è¡¨(å³éè¦å¨å³è¡¨ä¸å建索å¼)
LEFT JOINæ¡ä»¶ç¨äºç¡®å®ä»å³è¡¨æç´¢è¡ï¼å·¦è¾¹çä¸å®é½æ
-
å ³èæ¥è¯¢ç´¢å¼å»ºè®®ï¼
1ï¼ä¿è¯2ï¼left joinï¼
被驱å¨çç´¢å¼
éæ©å°è¡¨ä½ä¸ºé©±å¨è¡¨ï¼å¤§è¡¨ä½ä¸ºè¢«é©±å¨è¡¨
ï¼right joinåç¸åï¼
3ï¼inner joinï¼ä¼èªå¨éæ©å°çç»æéä½ä¸ºé©±å¨è¡¨
4ï¼
æå¯è½ä½¿ç¨ä¸å°ç´¢å¼
åæ¥è¯¢å°½éä¸è¦æ¾å¨è¢«é©±å¨è¡¨ï¼
å.åæ¥è¯¢ç´¢å¼ä¼åï¼
- explainåæ
-
1.åæ¥è¯¢ä¸ä½¿ç¨not inï¼æªæ·»å ç´¢å¼
-
2.åæ¥è¯¢ä¸ä½¿ç¨not inï¼æ·»å ç´¢å¼
-
3.ä¼åï¼å°åæ¥è¯¢çnot inæ¹ä¸ºleft outer join on xxx is null
-
对æ¯åæï¼
1å2对æ¯ï¼å¨æ·»å ç´¢å¼åï¼æ«æçç©çè¡æ°åå°äºä¸åï¼
åæ¥è¯¢æ¹ä¸ºleft outer join åï¼æ«æçç©ç彿°æä¸ä¸ªææ°çº§çæåï¼è¿æ¯ç±äºæä»¬å©ç¨äºè¦çç´¢å¼åis nullä¸ä¼ç´¢å¼å¤±æçç¹æ§ã
-
åæ¥è¯¢ä¼å建议ï¼
å°½éä¸è¦ä½¿ç¨not inænot existsï¼å½åæ¥è¯¢ä¸åºç° not inæ¶ï¼å°åæ¥è¯¢æ¹ä¸ºleft outer join on
äº.order byå ³é®åä¼åï¼
- explainåæ
-
1.æ è¿æ»¤æ¡ä»¶ï¼å¿ ç¶ä¼åºç° Using filesort
-
2.limitè¿æ»¤æ¡ä»¶ï¼ç´¢å¼çæ
-
3.whereæ¡ä»¶éå¶ï¼order by 2 åæ®µ(2åæ®µä¸ºå·²å»ºç«ç»åç´¢å¼å段ï¼å¹¶æç §ç»åç´¢å¼çé¡ºåºæåº)ï¼ç´¢å¼çæ
-
4.whereæ¡ä»¶éå¶ï¼order by 2 åæ®µ(2åæ®µä¸ºå·²å»ºç«ç»åç´¢å¼å段ï¼ä½æåºç顺åºåç»åç´¢å¼ç顺åºä¸ä¸è´)ï¼åºç°Using filesort
-
5.whereæ¡ä»¶éå¶ï¼order by 2 åæ®µ(å ¶ä¸æä¸å段为éç»åç´¢å¼å段)ï¼åºç°Using filesort
-
6.whereæ¡ä»¶éå¶ï¼where andæ¡ä»¶çå¼ç¡®å®ï¼æåºæ¡ä»¶ä¸æè¯¥å®å¼å段ï¼å³ä½¿order byååæ®µé¡ºåºåç»åç´¢å¼ç顺åºä¸ä¸è´(æåºå段å»é¤å®å¼å段åå©ä½å段åç»åç´¢å¼é¡ºåºä¸è´)ï¼æ¤æ¶ä¸ä¼åºç°Using filesort
-
7.order byåè·çæåºå段æ¯descåasc ç»åï¼ä¸è®ºæåºé¡ºåºæ¯å¦åç»åç´¢å¼é¡ºåºä¸è´ï¼å¿ ç¶ä¼åºç°Using filesort
- order by ç´¢å¼å¯¹æ¯ï¼
1ï¼
æ è¿æ»¤æ¡ä»¶(æ whereålimit)
çorder by å¿ ç¶ä¼åºç° Using filesort
2ï¼è¿æ»¤æ¡ä»¶ä¸çåæ®µåorder by åè·ç
åæ®µç顺åºä¸ä¸è´
ï¼å¿ ç¶ä¼åºç° Using filesort
3ï¼order byåè·çåæ®µæåº
峿DESC乿ASC
ï¼å¿ ç¶ä¼åºç°Using filesort
4ï¼whereæ¡ä»¶çå¼ç¡®å®ï¼ä¸order byåè·äºè·äºwhereæ¡ä»¶çæåºå段(order by åæ®µå»é¤å®å¼å段åå©ä½ååæ®µ)ï¼å³ä½¿order byåè·çåæ®µåç»åç´¢å¼å段顺åºä¸ä¸è´ï¼ä¹ä¸ä¼åºç°Using filesort
- order by ç´¢å¼å»ºè®®ï¼
1ï¼å°½éå¨ç´¢å¼åä¸å®ææåºæä½ï¼ éµå¾ªæä½³ååç¼æ³å
2ï¼order byåå¥ï¼å°½é使ç¨indexæ¹å¼æåºï¼é¿å
使ç¨filesortæ¹å¼
- æ ç´¢å¼order byæåºç®æ³ï¼ï¼
æ«æ2次ç£çè·åæç»æ°æ®ï¼ç¬¬ä¸æ¬¡æ«æè¯»åè¡æéåorder byåæ®µåçå¼è¿è¡æåºï¼å·éåºéè¦çæå®åºçè¡æéï¼ç¬¬äºæ¬¡æ«æè¯»åæéçå ¨é¨æ°æ®
åè·¯æåºï¼
ä»ç£çä¸è¯»åæ¥è¯¢æéçå ¨é¨åï¼å¨buffä¸è¿è¡æåºï¼æåºåè¿è¡è¾åºï¼åªéè¦æ«æä¸æ¬¡ç£ç
åè·¯æåºï¼
åè·¯æåºç¸æ¯åè·¯æåºä¼åå°I/O次æ°ï¼ä½ä¼æ¶èæ´å¤çå åï¼å¦æååºçæ°æ®æ»å¤§å°è¶ åºsort_bufferç容éï¼ä¼å建tempæä»¶è¿è¡å¤è·¯åå¹¶ï¼åèä¼å¢å I/O次æ°ï¼åçåè·¯æåºä¹ä¼åºç°åæ ·çé®é¢ï¼ä½åè·¯æåºçç¸å¯¹å çè¦é«å¾å¤
é®é¢ï¼
ä¼åï¼
1ï¼å¢å¤§sort_buffer_size
2ï¼å¢å¤§max_length_for_sort_data
3ï¼åå°selectåè·çæ¥è¯¢å段
å . limit å页æ¥è¯¢ä¼åï¼
- explainåæ
-
0.æªå ç´¢å¼(åå§ç¶æ)
-
1.ä¼åï¼ç»deptIdæ·»å ç´¢å¼
-
2.åä¼åï¼å©ç¨è¦çç´¢å¼å°éè¦çæ°æ®è¡ç主é®è·åå°ï¼åç¨è¿ä¸ªä¸»é®å䏿°æ®è¡¨åå ³è
-
ä¸è¿°limit ç´¢å¼Explainåæï¼
1ï¼ä¹æä»¥ SELECT SQL_NO_CACHE * FROM emp ORDER BY deptId LIMIT 10000,40;
卿·»å ç´¢å¼ååçExplainåå®é
æ¥è¯¢èæ¶é½æ ææ¾ååï¼æ¯å 为æä»¬æ¥è¯¢çåæ®µä¸ºselect*ï¼æ¥è¯¢äºå
¨é¨çåæ®µï¼è¿æ¶åæå¨è®¤ä¸ºæ¯å¦ä½¿ç¨ç´¢å¼å·²æ å¿
è¦ï¼mysql使ç¨äºfilesortï¼ä¸æ¬¡å è½½å
¨é¨æ°æ®å¨å
åä¸è¿è¡æ°æ®å¤çï¼ä½å½æä»¬æselect*æ¹ä¸ºselect idåï¼mysqlç¨å°äºè¦çç´¢å¼ï¼å³ææä½¿ç¨å°äºç´¢å¼ï¼æä»¥æçæäºææ¾çæå