MySQL占用CPU100%解决一例(2)

可以看出语句没有使用索引而是使用全表扫描。分别对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中如何在线创建索引?

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/cc0608750994ac49aaffc3fa70aa6212.html