MYSQL 8 基本操作之04 (索引)

2019-08-17  本文已影响0人  轻飘飘D
  1. 创建索引
root@127.0.0.1 : testdb【11:03:23】134 SQL->alter table mp_user drop index ind_mp_user_01;
root@127.0.0.1 : testdb【11:03:23】134 SQL->create index ind_mp_user_01 on mp_user(mp_user_name) using btree;
or
root@127.0.0.1 : testdb【10:24:07】10 SQL->alter table mp_user add index ind_mp_user_01 (mp_user_name) using btree;

root@127.0.0.1 : testdb【11:03:26】135 SQL->explain select * from mp_user where mp_user_name='xag5' \G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: mp_user
   partitions: NULL
         type: ref
possible_keys: ind_mp_user_01
          key: ind_mp_user_01
      key_len: 83
          ref: const
         rows: 1
     filtered: 100.00
        Extra: Using index

root@127.0.0.1 : testdb【11:20:13】197 SQL->SHOW INDEX FROM mp_user;
+---------+------------+----------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name       | Seq_in_index | Column_name  | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| mp_user |          0 | PRIMARY        |            1 | mp_user_seq  | A         |           2 |     NULL |   NULL |      | BTREE      |         |               | YES     | NULL       |
| mp_user |          1 | ind_mp_user_01 |            1 | mp_user_name | A         |           2 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------------+--------------+--------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+

2.B-TREE索引与HASH索引,两者的区别

B-TREE索引
B-TREE索引的特点

B-TREEB-TREE以B+树结构存储数据,大大加快了数据的查询速度
B-TREE索引在范围查找的SQL语句中更加适合(顺序存储)
 
B-TREE索引使用场景

全值匹配的查询SQL,如 where act_id= '1111_act'
联合索引汇中匹配到最左前缀查询,如联合索引 KEY idx_actid_name(act_id,act_name) USING BTREE,只要条件中使用到了联合索引的第一列,就会用到该索引,但如果查询使用到的是联合索引的第二列act_name,该SQL则便无法使用到该联合索引(注:覆盖索引除外)
匹配模糊查询的前匹配,如where act_name like '11_act%'
匹配范围值的SQL查询,如where act_date > '9865123547215'(not in和<>无法使用索引)
覆盖索引的SQL查询,就是说select出来的字段都建立了索引
 

HASH索引
HASH的特点

Hash索引基于Hash表实现,只有查询条件精确匹配Hash索引中的所有列才会用到hash索引,
例如=和<=>【安全等於 NULL是等於NULL的】操作符(但是快很多)
存储引擎会为Hash索引中的每一列都计算hash码,Hash索引中存储的即hash码,所以每次读取都会进行两次查询
Hash索引无法用于排序
Hash不适用于区分度小的列上,如性别字段

3.查看索引使用情况

#如果索引正在工作,则Handler_read_key 值将很高(代表一个索引值被读的次数,很低则表示索引很少被使用)
#Handler_read_rnd_next值高意味着查询低效,需要建立索引补救(值表在数据文件中读下一行的请求数,如果进行大量的表扫描则Handler_read_rnd_next值较高,通常未使用到索引)
root@127.0.0.1 : testdb【10:42:17】14 SQL->show status like 'Handler_read%';
+-----------------------+-------+
| Variable_name         | Value |
+-----------------------+-------+
| Handler_read_first    | 3     |
| Handler_read_key      | 120   |
| Handler_read_last     | 0     |
| Handler_read_next     | 164   |
| Handler_read_prev     | 0     |
| Handler_read_rnd      | 14    |
| Handler_read_rnd_next | 17    |
+-----------------------+-------+
上一篇 下一篇

猜你喜欢

热点阅读