mysql的索引
2015-10-05 16:46
573 查看
什么是索引:当你在字典中查找你的名字的时候,你有两种方式。第一、一页一页的翻,第二、通过拼音、笔画,等查找。那么第二种方式就是通过索引的方式查找。那么在myslq中数据库也是这么干的。索引可以增加查询速度,但是同时mysql维护索引也需要耗费性能。
索引的分类:
| 主键索引
如果一个字段为主键(primary key),则mysql会自动在该字段上建立主键索引
| 唯一索引
如果一个字段的值,在整张表中是唯一的,那么就可以在该字段上建立唯一索引,一旦通过唯一索引查找到了数据,就不需要继续查找了,因为它唯一的。它与主键索引的区别是主键索引必须建立在 主键上。
| 普通索引
如果在一个不是主键、其值不是唯一的字段上建立索引,则此类索引就是普通索引。
| 全文索引
如果在某个字段上建立了全文索引,则mysql会将该字段内的值,它认为是关键字的字眼抽取出来,然后对每个关键字建立索引,这就是全文索引。注意:全文索引需要myisam引擎支持。
| 复合索引
我们在建立索引的时候,可以针对多个字段,一起建立索引。当使用多个字段在一起建立索引时,此类索引为复合索引。
建立唯一索引或全文索引:
语法1: create [unique|fulltext] index index_name on table_name (table_ field);
例:地方在goods表的goods_name字段上建立了一个名为goods_name的普通索引。
建立普通索引或复合索引:
语法2:alter tabel table_name add index index_type index_name (field);
例:
查询索引:
语法:
1、show index from table_name;
2、show keys from table_name;
例:
删除索引:
语法1:drop index index_name
on table_name;
例:
语法2:alter table
table_name drop index index_name;
例:
测试索引效果:
语法:explain select语句;
例:
没有索引的情况:
有索引的情况:
select_type:查询类型,说明
Type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 const、eq_reg、ref、range、index和ALL
all:full table scan ;mysql将遍历全表以找到匹配的行;
index:index scan; index 和 all的区别在于index类型只遍历索引;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值的行,常见与between ,< ,>等查询;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;
const,system:当mysql对某查询某部分进行优化,并转为一个常量时,使用这些访问类型。如果将主键置于where列表中,mysql就能将该查询转化为一个常量。
索引的坏处:
| 占据磁盘空间。有时候索引的大小要大于数据的大小。
| 减慢了数据插入和删除的速度。因为每次插入和删除的时候都需要更新索引,一个表拥有的索引越多,则写操作的平均性能下降就越大。
| 造成存储碎片的问题。当删除一条记录时将会导致对应的索引中的该记录一的对应项为空,由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片。存储碎片不但占据磁盘空间,还降低数据库性能。
索引的分类:
| 主键索引
如果一个字段为主键(primary key),则mysql会自动在该字段上建立主键索引
| 唯一索引
如果一个字段的值,在整张表中是唯一的,那么就可以在该字段上建立唯一索引,一旦通过唯一索引查找到了数据,就不需要继续查找了,因为它唯一的。它与主键索引的区别是主键索引必须建立在 主键上。
| 普通索引
如果在一个不是主键、其值不是唯一的字段上建立索引,则此类索引就是普通索引。
| 全文索引
如果在某个字段上建立了全文索引,则mysql会将该字段内的值,它认为是关键字的字眼抽取出来,然后对每个关键字建立索引,这就是全文索引。注意:全文索引需要myisam引擎支持。
| 复合索引
我们在建立索引的时候,可以针对多个字段,一起建立索引。当使用多个字段在一起建立索引时,此类索引为复合索引。
建立唯一索引或全文索引:
语法1: create [unique|fulltext] index index_name on table_name (table_ field);
例:地方在goods表的goods_name字段上建立了一个名为goods_name的普通索引。
建立普通索引或复合索引:
语法2:alter tabel table_name add index index_type index_name (field);
例:
查询索引:
语法:
1、show index from table_name;
2、show keys from table_name;
例:
删除索引:
语法1:drop index index_name
on table_name;
例:
语法2:alter table
table_name drop index index_name;
例:
测试索引效果:
语法:explain select语句;
例:
没有索引的情况:
有索引的情况:
select_type:查询类型,说明
Type:这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为 const、eq_reg、ref、range、index和ALL
all:full table scan ;mysql将遍历全表以找到匹配的行;
index:index scan; index 和 all的区别在于index类型只遍历索引;
range:索引范围扫描,对索引的扫描开始于某一点,返回匹配值的行,常见与between ,< ,>等查询;
ref:非唯一性索引扫描,返回匹配某个单独值的所有行,常见于使用非唯一索引即唯一索引的非唯一前缀进行查找;
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配,常用于主键或者唯一索引扫描;
const,system:当mysql对某查询某部分进行优化,并转为一个常量时,使用这些访问类型。如果将主键置于where列表中,mysql就能将该查询转化为一个常量。
索引的坏处:
| 占据磁盘空间。有时候索引的大小要大于数据的大小。
| 减慢了数据插入和删除的速度。因为每次插入和删除的时候都需要更新索引,一个表拥有的索引越多,则写操作的平均性能下降就越大。
| 造成存储碎片的问题。当删除一条记录时将会导致对应的索引中的该记录一的对应项为空,由于索引是采用 B 树结构存储的,所以对应的索引项并不会被删除,经过一段时间的增删改操作后,数据库中就会出现大量的存储碎片。存储碎片不但占据磁盘空间,还降低数据库性能。
相关文章推荐
- MySQL备份与恢复
- MySQL命令大全及查询语句
- mysql 卸载-安装-主从集群
- mysql5.6通过mysqldump自动备份
- MySql对用户的管理【初级】
- spark集成hive遭遇mysql check失败的问题
- spark集成hive遭遇mysql check失败的问题
- Mysql5.1安装与配置(win7-x64)
- 安装"MySQLdb"一波三折.
- 删除绿色版MySq
- mysql常用命令
- MySQL执行update时的[ERROR 1093]处理方法
- i.MX6开发板学习笔记三——MySql-5.1移植及测试
- mysql 学习记录(八)--修改表的字符集格式
- 解决交叉编译mysql出现缺少/usr/local/ncurses/lib/libncurses.a
- c访问mysql的完整例子
- 移植mysql到tiny6410并附带怎么使6410跑mysql设置
- XAMPP for MAC 安装后MYSQL不能正常启动的解决办法
- MySQL 调优/优化的 100 个建议
- Mysql数据库的使用总结之ERROR 1146 (42S02)