MySQL索引

索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存。如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录。表里面的记录数量越多,这个操作的代价就越高。如果作为搜索条件的列上已经创建了索引,MySQL无需扫描任何记录即可迅速得到目标记录所在的位置。如果表有1000个记录,通过索引查找记录至少要比顺序扫描记录快100倍。

所有mysql列类型能被索引。在相关的列上的使用索引是改进 SELECT操作性能的最好方法。

如果我们创建了name列的索引,MySQL将在索引中排序name列的值。

一个表最多可有16个索引。最大索引长度是256个字节。对于CHAR和VARCHAR列,可以索引列的前缀。这更快并且比索引整个列需要较少的磁盘空间。对于BLOB和TEXT列,必须索引列的前缀,不能索引列的全部。

MySQL能在多个列上创建索引。一个索引可以由最多15个列组成。(CHAR和VARCHAR列上,可以索引列的前缀作为一个索引的部分)。

查看索引
show index from 表名;

创建索引
alter table 表名 add index 索引名 (列名列表) 普通索引
alter table 表名 add unique 索引名 (列名列表) 唯一值索引
alter table 表名 add primary key 索引名 (列名列表) 主键索引

create index语句创建索引
(MySQL通常在内部将create index映射到alter table,是在MySQL3.23中引入的。)

create unique index 索引名 on 表名 (列名列表)
create index 索引名 on 表名 (列名列表)

不能用create index语句来创建primary key 索引。

删除索引
alter table 表名 drop primary key,drop index 索引名; 删除主键索引和普通索引

drop index删除索引
drop index通常在内部作为一条语句处理,是在MySQL3.22中引入的。

drop index 索引名 on 表名

create table 语句可以对某个串列的前缀进行索引(列值的最左边n个字符)。如果对某个串列的前缀进行索引,应用 列名列表 说明符表示该列语法为:列名1(n),列名2(n)

在MyISAM表索引中,对于BLOB和TEXT列也需要前缀索引。

由于索引文件以B-树格式保存,MySQL能够立即转到合适的firstname,然后再转到合适的lastname,最后转到合适的age。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录!
  那么,如果在firstname、lastname、age这三个列上分别创建单列索引,效果是否和创建一个firstname、lastname、 age的多列索引一样呢?答案是否定的,两者完全不同。当我们执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于firstname、lastname、age这三个列上的多列索引。

索引的缺点
  到目前为止,我们讨论的都是索引的优点。事实上,索引也是有缺点的。
  首先,索引要占用磁盘空间。通常情况下,这个问题不是很突出。但是,如果你创建每一种可能列组合的索引,索引文件体积的增长速度将远远超过数据文件。如果你有一个很大的表,索引文件的大小可能达到操作系统允许的最大文件限制。
  第二,对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。这是因为MySQL不仅要把改动数据写入数据文件,而且它还要把这些改动写入索引文件。

在大型数据库中,索引是提高速度的一个关键因素。不管表的结构是多么简单,一次50000行的表扫描操作无论如何不会快。如果你的网站上也有这种大规模的表,那么你确实应该花些时间去分析可以采用哪些索引,并考虑是否可以改写查询以优化应用。要了解更多信息,请参见MySQL manual。另外注意,部分查询不能在3.22版MySQL以下版本执行。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值