文章目录 1、查看表 tb_user 2、展示索引 3、为profession、age、status创建 联合索引 4、查询 profession='软件工程' 5、执行计划 profession='软件工程' 6、创建profession单列索引 7、再次执行计划 profession='软件工程' 8、SQL提示 8.1、use index(idx_user_pro) 8.2、ignore index(idx_user_pro) 8.3、force index(idx_user_pro_age_sta)
1、查看表 tb_user
mysql> select * from tb_user;
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
| id | name | phone | email | profession | age | gender | status | createtime |
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
| 1 | 吕布 | 17799990000 | lvbu666@163. com | 软件工程 | 23 | 1 | 6 | 2001 - 02 - 02 00 : 00 : 00 |
| 2 | 曹操 | 17799990001 | caocao666@qq. com | 通讯工程 | 33 | 1 | 0 | 2001 - 03 - 05 00 : 00 : 00 |
| 3 | 赵云 | 17799990002 | 17799990 @139. com | 英语 | 34 | 1 | 2 | 2002 - 03 - 02 00 : 00 : 00 |
| 4 | 孙悟空 | 17799990003 | 17799990 @sina. com | 工程造价 | 54 | 1 | 0 | 2001 - 07 - 02 00 : 00 : 00 |
| 5 | 花木兰 | 17799990004 | 19980729 @sina. com | 软件工程 | 23 | 2 | 1 | 2001 - 04 - 22 00 : 00 : 00 |
| 6 | 大乔 | 17799990005 | daqiao666@sina. com | 舞蹈 | 22 | 2 | 0 | 2001 - 02 - 07 00 : 00 : 00 |
| 7 | 露娜 | 17799990006 | luna_love@sina. com | 应用数学 | 24 | 2 | 0 | 2001 - 02 - 08 00 : 00 : 00 |
| 8 | 程咬金 | 17799990007 | chengyaojin@163. com | 化工 | 38 | 1 | 5 | 2001 - 05 - 23 00 : 00 : 00 |
| 9 | 项羽 | 17799990008 | xiaoyu666@qq. com | 金属材料 | 43 | 1 | 0 | 2001 - 09 - 18 00 : 00 : 00 |
| 10 | 白起 | 17799990009 | baiqi666@sina. com | 机械工程及其自动
化 | 27 | 1 | 2 | 2001 - 08 - 16 00 : 00 : 00 |
| 11 | 韩信 | 17799990010 | hanxin520@163. com | 无机非金属材料工
程 | 27 | 1 | 0 | 2001 - 06 - 12 00 : 00 : 00 |
| 12 | 荆轲 | 17799990011 | jingke123@163. com | 会计 | 29 | 1 | 0 | 2001 - 05 - 11 00 : 00 : 00 |
| 13 | 兰陵王 | 17799990012 | lanlinwang666@126. com | 工程造价 | 44 | 1 | 1 | 2001 - 04 - 09 00 : 00 : 00 |
| 14 | 狂铁 | 17799990013 | kuangtie@sina. com | 应用数学 | 43 | 1 | 2 | 2001 - 04 - 10 00 : 00 : 00 |
| 15 | 貂蝉 | 17799990014 | 84958948374 @qq. com | 软件工程 | 40 | 2 | 3 | 2001 - 02 - 12 00 : 00 : 00 |
| 16 | 妲己 | 17799990015 | 2783238293 @qq. com | 软件工程 | 31 | 2 | 0 | 2001 - 01 - 30 00 : 00 : 00 |
| 17 | 芈月 | 17799990016 | xiaomin2001@sina. com | 工业经济 | 35 | 2 | 0 | 2000 - 05 - 03 00 : 00 : 00 |
| 18 | 嬴政 | 17799990017 | 8839434342 @qq. com | 化工 | 38 | 1 | 1 | 2001 - 08 - 08 00 : 00 : 00 |
| 19 | 狄仁杰 | 17799990018 | jujiamlm8166@163. com | 国际贸易 | 30 | 1 | 0 | 2007 - 03 - 12 00 : 00 : 00 |
| 20 | 安琪拉 | 17799990019 | jdodm1h@126. com | 城市规划 | 51 | 2 | 0 | 2001 - 08 - 15 00 : 00 : 00 |
| 21 | 典韦 | 17799990020 | ycaunanjian@163. com | 城市规划 | 52 | 1 | 2 | 2000 - 04 - 12 00 : 00 : 00 |
| 22 | 廉颇 | 17799990021 | lianpo321@126. com | 土木工程 | 19 | 1 | 3 | 2002 - 07 - 18 00 : 00 : 00 |
| 23 | 后羿 | 17799990022 | altycj2000@139. com | 城市园林 | 20 | 1 | 0 | 2002 - 03 - 10 00 : 00 : 00 |
| 24 | 姜子牙 | 17799990023 | 37483844 @qq. com | 工程造价 | 29 | 1 | 4 | 2003 - 05 - 26 00 : 00 : 00 |
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
24 rows in set ( 0.00 sec)
2、展示索引
mysql> show index from tb_user;
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| tb_user | 0 | PRIMARY | 1 | id | A | 24 | NULL | NULL | | BTREE | | | YES | NULL |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
1 row in set ( 0.01 sec) mysql>
3、为profession、age、status创建 联合索引
mysql> create index idx_user_pro_age_sta on tb_user ( profession, age, status) ;
Query OK, 0 rows affected ( 0.03 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from tb_user;
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| tb_user | 0 | PRIMARY | 1 | id | A | 24 | NULL | NULL | | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 1 | profession | A | 16 | NULL | NULL | YES | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 2 | age | A | 22 | NULL | NULL | YES | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 3 | status | A | 24 | NULL | NULL | YES | BTREE | | | YES | NULL |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
4 rows in set ( 0.01 sec) mysql>
4、查询 profession=‘软件工程’
mysql> select * from tb_user where profession= '软件工程' ;
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
| id | name | phone | email | profession | age | gender | status | createtime |
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
| 5 | 花木兰 | 17799990004 | 19980729 @sina. com | 软件工程 | 23 | 2 | 1 | 2001 - 04 - 22 00 : 00 : 00 |
| 1 | 吕布 | 17799990000 | lvbu666@163. com | 软件工程 | 23 | 1 | 6 | 2001 - 02 - 02 00 : 00 : 00 |
| 16 | 妲己 | 17799990015 | 2783238293 @qq. com | 软件工程 | 31 | 2 | 0 | 2001 - 01 - 30 00 : 00 : 00 |
| 15 | 貂蝉 | 17799990014 | 84958948374 @qq. com | 软件工程 | 40 | 2 | 3 | 2001 - 02 - 12 00 : 00 : 00 |
+ -- -- + -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- + -- -- -- + -- -- -- -- + -- -- -- -- + -- -- -- -- -- -- -- -- -- -- - +
4 rows in set ( 0.00 sec) mysql>
5、执行计划 profession=‘软件工程’
mysql> explain select * from tb_user where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro_age_sta | idx_user_pro_age_sta | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql>
6、创建profession单列索引
mysql> create index idx_user_pro on tb_user ( profession) ;
Query OK, 0 rows affected ( 0.02 sec)
Records: 0 Duplicates: 0 Warnings: 0 mysql> show index from tb_user;
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
| tb_user | 0 | PRIMARY | 1 | id | A | 24 | NULL | NULL | | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 1 | profession | A | 16 | NULL | NULL | YES | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 2 | age | A | 22 | NULL | NULL | YES | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro_age_sta | 3 | status | A | 24 | NULL | NULL | YES | BTREE | | | YES | NULL |
| tb_user | 1 | idx_user_pro | 1 | profession | A | 16 | NULL | NULL | YES | BTREE | | | YES | NULL |
+ -- -- -- -- - + -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- + -- -- -- -- -- -- - + -- -- -- -- -- - + -- -- -- -- -- -- - + -- -- -- -- -- + -- -- -- -- + -- -- -- + -- -- -- -- -- -- + -- -- -- -- - + -- -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- +
5 rows in set ( 0.01 sec) mysql>
7、再次执行计划 profession=‘软件工程’
mysql> explain select * from tb_user where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro_age_sta, idx_user_pro | idx_user_pro_age_sta | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql>
最终选择联合索引
8、SQL提示
SQL提示,是优化数据库的一个重要手段,简单来说,就是在SQL语句中加入一些人为的提示来达到优化操作的目的。
8.1、use index(idx_user_pro)
mysql> explain select * from tb_user use index ( idx_user_pro) where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro | idx_user_pro | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql>
8.2、ignore index(idx_user_pro)
mysql> explain select * from tb_user ignore index ( idx_user_pro) where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro_age_sta | idx_user_pro_age_sta | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql> explain select * from tb_user ignore index ( idx_user_pro_age_sta) where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro | idx_user_pro | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- - + -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql>
8.3、force index(idx_user_pro_age_sta)
mysql> explain select * from tb_user force index ( idx_user_pro_age_sta) where profession= '软件工程' ;
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
| 1 | SIMPLE | tb_user | NULL | ref | idx_user_pro_age_sta | idx_user_pro_age_sta | 47 | const | 4 | 100.00 | NULL |
+ -- -- + -- -- -- -- -- -- - + -- -- -- -- - + -- -- -- -- -- -- + -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- -- -- -- -- -- -- -- + -- -- -- -- - + -- -- -- - + -- -- -- + -- -- -- -- -- + -- -- -- - +
1 row in set, 1 warning ( 0.00 sec) mysql>