首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >MySQL数据库,详解索引管理

MySQL数据库,详解索引管理

作者头像
用户1289394
发布2021-12-02 09:02:39
发布2021-12-02 09:02:39
2K0
举报
文章被收录于专栏:Java学习网Java学习网

创建索引

⽅式1:

create [unique] index 索引名称 on 表名(列名[(length)]);

⽅式2:

alter 表名 add [unique] index 索引名称 on (列名[(length)]);

如果字段是char、varchar类型,length可以⼩于字段实际长度,如果是blog、text等长⽂本类型,必须指定length。

[unique]:中括号代表可以省略,如果加上了unique,表⽰创建唯⼀索引。

如果table后⾯只写⼀个字段,就是单列索引,如果写多个字段,就是复合索

引,多个字段之间⽤逗号隔开。

删除索引

drop index 索引名称 on 表名;

查看索引

查看某个表中所有的索引信息如下:

show index from 表名;

索引修改

可以先删除索引,再重建索引。

示例

准备200万数据

/*建库javacode2018*/

DROP DATABASE IF EXISTS javacode2018;

CREATE DATABASE javacode2018;USE javacode2018;

/*建表test1*/

DROP TABLE IF EXISTS test1;

CREATE TABLE test1 (

id INT NOT NULL COMMENT '编号',

name VARCHAR(20) NOT NULL COMMENT '姓名',

sex TINYINT NOT NULL COMMENT '性别,1:男,2:⼥',

email VARCHAR(50)

);

/*准备数据*/

DROP PROCEDURE IF EXISTS proc1;

DELIMITER $

CREATE PROCEDURE proc1()

BEGIN

DECLARE i INT DEFAULT 1;

START TRANSACTION;

WHILE i <= 2000000 DO

INSERT INTO test1 (id, name, sex, email) VALUES

(i,concat('javacode',i),if(mod(i,2),1,2),concat('javacode',i,'@163.com

'));

SET i = i + 1;

if i%10000=0 THEN

COMMIT;

START TRANSACTION;

END IF;

END WHILE;

COMMIT;

END $

DELIMITER ;

CALL proc1();

SELECT count(*) FROM test1;

上图中使⽤存储过程循环插⼊了200万记录,表中有4个字段,除了sex列,其他

列的值都是没有重复的,表中还未建索引。

插⼊的200万数据中,id,name,email的值都是没有重复的。⽆索引我们体验⼀下查询速度

mysql> select * from test1 a where a.id = 1;

+----+-----------+-----+-------------------+

| id | name | sex | email |

+----+-----------+-----+-------------------+

| 1 | javacode1 | 1 | javacode1@163.com |

+----+-----------+-----+-------------------+

1 row in set (0.77 sec)

上⾯我们按id查询了⼀条记录耗时770毫秒,我们在id上⾯创建个索引感受⼀下

速度。

创建索引

我们在id上⾯创建⼀个索引,感受⼀下:

mysql> create index idx1 on test1 (id);

Query OK, 0 rows affected (2.82 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from test1 a where a.id = 1;

+----+-----------+-----+-------------------+

| id | name | sex | email |

+----+-----------+-----+-------------------+

| 1 | javacode1 | 1 | javacode1@163.com |

+----+-----------+-----+-------------------+

1 row in set (0.00 sec)

上⾯的查询是不是⾮常快,耗时1毫秒都不到。

我们在name上也创建个索引,感受⼀下查询的神速,如下:

mysql> create unique index idx2 on test1(name);

Query OK, 0 rows affected (9.67 sec)

Records: 0 Duplicates: 0 Warnings: 0

mysql> select * from test1 where name = 'javacode1';

+----+-----------+-----+-------------------+

| id | name | sex | email |+----+-----------+-----+-------------------+

| 1 | javacode1 | 1 | javacode1@163.com |

+----+-----------+-----+-------------------+

1 row in set (0.00 sec)

查询快如闪电,有没有,索引是如此的神奇。

创建索引并指定⻓度

通过email检索⼀下数据

mysql> select * from test1 a where a.email =

'javacode1000085@163.com';

+---------+-----------------+-----+-------------------------+

| id | name | sex | email |

+---------+-----------------+-----+-------------------------+

| 1000085 | javacode1000085 | 1 | javacode1000085@163.com |

+---------+-----------------+-----+-------------------------+

1 row in set (1.28 sec)

耗时1秒多,回头去看⼀下插⼊数据的sql,我们可以看到所有的email记录,每条记录的

前⾯15个字符是不⼀样的,结尾是⼀样的(都是@163.com),通过前⾯15个字符就可以

定位⼀个email了,那么我们可以对email创建索引的时候指定⼀个长度为15,这样相对于

整个email字段更短⼀些,查询效果是⼀样的,这样⼀个页中可以存储更多的索引记录,

命令如下:

mysql> create index idx3 on test1 (email(15));

Query OK, 0 rows affected (7.67 sec)

Records: 0 Duplicates: 0 Warnings: 0

然后看⼀下查询效果:

mysql> select * from test1 a where a.email =

'javacode1000085@163.com';

+---------+-----------------+-----+-------------------------+

| id | name | sex | email |

+---------+-----------------+-----+-------------------------+

| 1000085 | javacode1000085 | 1 | javacode1000085@163.com |+---------+-----------------+-----+-------------------------+

1 row in set (0.00 sec)

耗时不到1毫秒,神速。

查看表中的索引

我们看⼀下test1表中的所有索引,如下:

mysql> show index from test1;

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name |

Collation | Cardinality | Sub_part | Packed | Null | Index_type |

Comment | Index_comment |

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

| test1 | 0 | idx2 | 1 | name | A

| 1992727 | NULL | NULL | | BTREE | |

|

| test1 | 1 | idx1 | 1 | id | A

| 1992727 | NULL | NULL | | BTREE | |

|

| test1 | 1 | idx3 | 1 | email | A

| 1992727 | 15 | NULL | YES | BTREE | |

|

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

3 rows in set (0.00 sec)

可以看到test1表中3个索引的详细信息(索引名称、类型,字段)。

删除索引

我们删除idx1,然后再列出test1表所有索引,如下:

mysql> drop index idx1 on test1;

Query OK, 0 rows affected (0.01 sec)

Records: 0 Duplicates: 0 Warnings: 0mysql> show index from test1;

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

| Table | Non_unique | Key_name | Seq_in_index | Column_name |

Collation | Cardinality | Sub_part | Packed | Null | Index_type |

Comment | Index_comment |

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

| test1 | 0 | idx2 | 1 | name | A

| 1992727 | NULL | NULL | | BTREE | |

|

| test1 | 1 | idx3 | 1 | email | A

| 1992727 | 15 | NULL | YES | BTREE | |

|

+-------+------------+----------+--------------+-------------

+-----------+-------------+----------+--------+------+------------

+---------+---------------+

2 rows in set (0.00 sec)

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java学习网 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档