可以看出语句没有使用索引而是使用全表扫描。分别对col4='123' 和col5='abc'做了统计,发现col4='123'的记录只有一条,而col5='abc'的记录有5W+条,很明显在col4上创建索引执行效率会高很多。查看表上是否有col4列上的索引(类似下面这种)。
mysql> show index from emp \G;
*************************** 1. row ***************************
Table: emp
Non_unique: 1
Key_name: idx_emp_2
Seq_in_index: 1
Column_name: deptno
Collation: A
Cardinality: 6
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
Index_comment:
1 row in set (0.00 sec)
ERROR:
No query specified
发现col4列上没有索引,表的存储引擎为 InnoDB,于是在col4列上创建索引
mysql> show table status from test1 like 'emp'\G;
*************************** 1. row ***************************
Name: emp
Engine: InnoDB
Version: 10
Row_format: Compact
Rows: 3072
Avg_row_length: 53
Data_length: 163840
Max_data_length: 0
Index_length: 65536
Data_free: 0
Auto_increment: NULL
Create_time: 2016-11-15 21:54:49
Update_time: NULL
Check_time: NULL
Collation: gbk_chinese_ci
Checksum: NULL
Create_options:
Comment:
1 row in set (0.00 sec)
ERROR:
No query specified
mysql> create index idx_sal on emp(sal);
Query OK, 0 rows affected (0.15 sec)
Records: 0 Duplicates: 0 Warnings: 0
再次查看执行计划,发现语句使用索引扫描。
mysql> explain select ename,hiredate,sal from emp where sal=1000 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: emp
type: ref
possible_keys: idx_sal
key: idx_sal
key_len: 6
ref: const
rows: 1
Extra: NULL
1 row in set (0.00 sec)
ERROR:
No query specified
sql语句的执行效率立马提升。CPU的使用率也降下来了。
这也还有一个疑问,oracle在创建索引时为了避免锁表引入了online创建索引。不知道mysql中如何在线创建索引?