前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mysql索引优化初体验(二)-使用索引

Mysql索引优化初体验(二)-使用索引

作者头像
程序员小明
发布2019-07-08 12:11:01
6710
发布2019-07-08 12:11:01
举报
文章被收录于专栏:程序员小明程序员小明

索引是如何工作的

首先,我们先创建t_user_action_log表,方便下面进行演示。

代码语言:javascript
复制
CREATE TABLE `t_user_action_log` (
  `id` BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `name` VARCHAR(32) DEFAULT NULL COMMENT '用户名',
  `ip_address` VARCHAR(50) DEFAULT NULL COMMENT 'IP地址',
  `action` INT4 DEFAULT NULL COMMENT '操作:1-登录,2-登出,3-购物,4-退货,5-浏览',
  `create_time` TIMESTAMP COMMENT '创建时间',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

假如我们要筛选 action为2的所有记录,SQL如下:

代码语言:javascript
复制
SELECT id, name, ip_address FROM t_user_action_log WHERE `action`=2;

通过查询分析器explain分析这条查询语句(就在这个语句前面加上explain):

代码语言:javascript
复制
EXPLAIN SELECT id, name, ip_address FROM t_user_action_log WHERE `action`=2;

分析结果如下:

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

t_user_action_log

ALL

1

100.00

Using where

左右滑动查看更多

其中type为ALL表示要进行全表扫描。这样效率无疑是极慢的。

下面为action列添加索引:

代码语言:javascript
复制
ALTER TABLE t_user_action_log ADD INDEX (`action`);

然后再次执行查询分析,结果如下:

id

select_type

table

partitions

type

possible_keys

key

key_len

ref

rows

filtered

Extra

1

SIMPLE

t_user_action_log

ref

action

action

5

const

1

100.00

左右滑动查看更多

我们看到这次查询就使用索引了。加索引前Extra的值是Using Where,type的值为ALL,加索引后Extra的值为空,type的值为ref,表示使用引用。

那么为什么索引会提高查询速度呢?原因是索引会根据索引值进行分类,这样就不用再进行全表扫描了。

示意图

比如上图,action值为2的索引值分类存储在了索引空间,可以快速地查询到索引值所对应的列。

如何使用

下面介绍一下如何使用SQL创建、查看和删除索引。

创建索引的三种方式:

使用CREATE INDEX创建,语法如下:

代码语言:javascript
复制
CREATE INDEX indexName ON tableName (columnName(length));

例如我们对ip_address这一列创建一个长度为16的索引:

代码语言:javascript
复制
CREATE INDEX index_ip_addr ON t_user_action_log (ip_address(16));

使用ALTER语句创建,语法如下:

代码语言:javascript
复制
ALTER TABLE tableName ADD INDEX indexName(columnName);

ALTER语句创建索引前面已经有例子了。下面提供一个设置索引长度的例子:

代码语言:javascript
复制
ALTER TABLE t_user_action_log ADD INDEX ip_address_idx (ip_address(16));

建表的时候创建索引:

代码语言:javascript
复制
CREATE TABLE tableName(  
  id INT NOT NULL,   
  columnName  columnType,
  INDEX [indexName] (columnName(length))  
);

查看索引

可以通过show语句查看某张表用到哪些索引:

代码语言:javascript
复制
SHOW INDEX FROM t_user_action_log;

Table

Non_unique

Key_name

Seq_in_index

Column_name

Collation

Cardinality

Sub_part

Packed

Null

Index_type

Comment

Index_comment

t_user_action_log

0

PRIMARY

1

id

A

199,368

BTREE

t_user_action_log

1

action

1

action

A

4

YES

BTREE

t_user_action_log

1

index_ip_addr

1

ip_address

A

1

16

YES

BTREE

左右滑动查看更多

删除索引

使用ALTER命令可以删除索引,例如:

代码语言:javascript
复制
ALTER TABLE t_user_action_log DROP INDEX index_ip_addr;
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员小明 微信公众号,前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 索引是如何工作的
  • 如何使用
    • 使用CREATE INDEX创建,语法如下:
      • 使用ALTER语句创建,语法如下:
        • 建表的时候创建索引:
          • 查看索引
            • 删除索引
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档