【MYSQL】索引

1. 索引长度

对于定长数据类型(char,int,datetime),如果有是否为NULL的标记,这个标记需要占用1个字节。

对于变长数据类型(varchar),除了是否为NULL的标记外,还需要有长度信息,需要占用2个字节,当字段定义为NOT NULL的时候,是否为NULL的标记将不占用字节。

不同的字符集: - latin1编码一个字符一个字节; - gbk编码的为一个字符2个字节; - utf8编码的一个字符3个字节。

创建索引的时候可以指定索引的长度,例如:

alter table test add index uri(uri(30));

长度30指的是字符的个数,如果为utf8编码varchar(255),key_length=30*3+2=92个字节。

对于多数名称的前10个字符通常不同的列,用前10个字符作为索引不会比使用列全名创建的索引速度慢很多。另外,使用列的一部分创建索引可以使索引文件大大减小,从而节省了大量的磁盘空间,有可能提高INSERT操作的速度。

2. 单列索引

# 普通索引
key 列名(列名)
key cat_id(cat_id)

# 唯一索引
unique key
unique key email(email)

# 主键索引,一张表只能存在一个
primary key (列名)
primary key (id)

# 全文索引 fulltext
# 在中文环境下几乎无效。一般用第三方解决方案sphinx

索引长度:建索引时,可以取列的部分字符作为索引,节省空间, 例如:unique key email(email(10)); 取email列的前10个字符作为索引。

3. 多列索引

把两列或多列的值作为整体后再建索引,左前缀规则,例如key xm(xing, ming)

CREATE TABLE name (
  xing CHAR(2),
  ming CHAR(10),
  KEY xm(xing,ming)
);

# 在select前面添加explain关键字,得到结果的possible_key可以查看是否使用到索引查询。
# 使用索引xm查询
EXPLAIN SELECT * FROM name WHERE xing='刘' AND ming='备';

# 使用索引xm查询
EXPLAIN SELECT * FROM name WHERE xing='刘';

# 没有使用索引xm查询
EXPLAIN SELECT * FROM name WHERE ming='备';

4. 冗余索引

在某个列上可能存在多个索引,比如某个表:key xm(xing, ming),key ming(ming),对于列ming来说,索引xm和ming两个索引覆盖,叫做冗余索引。

5. 索引操作

# 查看索引
SHOW INDEX FROM 表名;

# 删除索引
ALTER TABLE 表名 DROP INDEX 索引名;

# 添加索引
# 添加普通索引
ALTER TABLE 表名 ADD INDEX 索引名(列名...);
# 添加唯一索引
ALTER TABLE 表名 ADD UNIQUE 索引名(列名);
# 添加主键索引
ALTER TABLE 表名 ADD PRIMARY KEY(列名);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

攻城狮·建哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值