MySQL Study之--Index的强制使用和忽略

1、查看表结构

mysql> show create table emp\G

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Table: emp
Create Table: CREATE TABLE `emp` (
  `empno` int(4) NOT NULL DEFAULT '0',
  `ENAME` varchar(10) DEFAULT NULL,
  `JOB` varchar(9) DEFAULT NULL,
  `MGR` int(4) DEFAULT NULL,
  `HIRE` date DEFAULT NULL,
  `SAL` int(7) DEFAULT NULL,
  `COMM` int(7) DEFAULT NULL,
  `deptno` int(2) DEFAULT NULL,
  PRIMARY KEY (`empno`),
  KEY `deptno` (`deptno`),
  CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`deptno`) REFERENCES `dept` (`deptNO`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

---在此表中empno 为主键,在deptno上建有索引

mysql> select * from emp;

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
+-------+--------+-----------+------+------------+------+------+--------+
| empno | ENAME  | JOB       | MGR  | HIRE       | SAL  | COMM | deptno |
+-------+--------+-----------+------+------------+------+------+--------+
|  7369 | SMITH  | CLERK     | 7902 1980-12-17 |  800 | NULL |     20 |
|  7499 | ALLEN  | SALESMAN  | 7698 1981-02-20 1600 |  300 |     30 |
|  7521 | WARD   | SALESMAN  | 7698 1981-02-22 1250 |  500 |     30 |
|  7566 | JONES  | MANAGER   | 7839 1981-04-02 2975 | NULL |     20 |
|  7654 | MARTIN | SALESMAN  | 7698 1981-09-28 1250 1400 |     30 |
|  7698 | BLAKE  | MANAGER   | 7839 1981-05-01 2850 | NULL |     30 |
|  7782 | CLARK  | MANAGER   | 7839 1981-06-09 2450 | NULL |     10 |
|  7788 | SCOTT  | ANALYST   | 7566 1987-07-13 3000 | NULL |     10 |
|  7839 | KING   | PRESIDENT | NULL | 1981-11-17 5000 | NULL |     10 |
|  7844 | TURNER | SALESMAN  | 7698 1981-09-08 1500 |    0 |     30 |
|  7876 | ADAMS  | CLERK     | 7788 1987-06-13 1100 | NULL |     20 |
|  7900 | JAMES  | CLERK     | 7698 1981-12-03 |  950 | NULL |     30 |
|  7902 | FORD   | ANALYST   | 7566 1981-12-03 3000 | NULL |     20 |
|  7934 | MILLER | CLERK     | 7782 1982-01-23 1300 | NULL |     10 |
+-------+--------+-----------+------+------------+------+------+--------+
14 rows in set (0.00 sec)

1)全表扫描查询

mysql> explain select * from emp \G

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

1
2
3
4
5
6
7
8
9
10
11
  id: 1
  select_type: SIMPLE
        table: emp
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 14
        Extra: NULL
1 row in set (0.00 sec)

2、通过主键查询

mysql> explain select * from emp where empno=7788\G

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

1
2
3
4
5
6
7
8
9
10
11
        id: 1
  select_type: SIMPLE
        table: emp
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: const
         rows: 1
        Extra: NULL
1 row in set (0.02 sec)

3)忽略主键索引

mysql> explain select * from emp ignore index(pri) where empno=7788\G

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

1
2
3
4
5
6
7
8
9
10
11
      id: 1
  select_type: SIMPLE
        table: emp
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 14
        Extra: Using where
1 row in set (0.00 sec)

4)强制使用主键

mysql> explain select * from emp force index(pri) where empno=7788\G

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

1
2
3
4
5
6
7
8
9
10
11
  id: 1
  select_type: SIMPLE
        table: emp
         type: const
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 4
          ref: const
         rows: 1
        Extra: NULL
1 row in set (0.00 sec)

5)通过索引deptno查询

mysql> explain select * from emp where deptno=10\G

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

1
2
3
4
5
6
7
8
9
10
11
id: 1
  select_type: SIMPLE
        table: emp
         type: ref
possible_keys: deptno
          key: deptno
      key_len: 5
          ref: const
         rows: 4
        Extra: NULL
1 row in set (0.00 sec)

6)忽略索引的使用

mysql> explain select * from emp ignore index(deptno) where deptno=10\G

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

1
2
3
4
5
6
7
8
9
10
11
  id: 1
  select_type: SIMPLE
        table: emp
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 14
        Extra: Using where
1 row in set (0.00 sec)

7)强制使用索引

mysql> explain select * from emp  force index (deptno) where deptno=10\G

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

1
2
3
4
5
6
7
8
9
10
11
  id: 1
  select_type: SIMPLE
        table: emp
         type: ref
possible_keys: deptno
          key: deptno
      key_len: 5
          ref: const
         rows: 4
        Extra: NULL
1 row in set (0.00 sec)









本文转自 客居天涯 51CTO博客,原文链接:http://blog.51cto.com/tiany/1726065,如需转载请自行联系原作者
上一篇:双非数学硕士零基础转大数据开发,收割腾讯 字节 百度等10个大厂 SP offer


下一篇:985统计学硕士的腾讯 飞书 抖音 Tiktok 数据分析面经(均已拿offer)