MySQL学习之——索引篇
2015-07-09 17:51
579 查看
主键:主键是能够唯一标识表中某一行的属性或者属性组。一个表只能有一个主键,但可以有多个候选索引。主键可以保证记录的唯
一和主键域非空,数据库管理系统对于主键自动生成唯一的索引,索引主键页是一个特殊的索引。
primary key 和unique key 的区别:
primary key 就是主键索引
unique key 是唯一性索引,
1.主键不能为空,但是unique key 可以为空,两者在表中都是唯一不能重复的值。
2.主键一定是唯一的索引,唯一的索引不一定是主键
3.主键可以被其他的表做外键引用,而索引不能作为外键引用
外键:foreign key 。MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种
(以下3点是查资料查到的)
① 两个表必须是InnoDB表,MyISAM表暂时不支持外键
② 外键列必须建立了索引,MySQL
4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
普通索引:索引的创建有3中方式
create table table_name([...] , index [索引名] (列的列名))
create index [索引名] on table (列的列名)
alter table table_name add index [索引名] (列的列名)
唯一性索引的建立就在索引名前加 unique 这个关键字 (唯一性索引,处理字段数据的唯一性,其余的和普通索引一
样)。
全文索引:
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在varchar或者text类型的列上创建。它可以通过create table命令创建,也可以通过alert table或create
index命令创建。对于大规模的数据集,通过alter table(或者create index)命令创建全文索引要比把记录插入带有全文索引的空表更快。
单列索引和多列索引:
索引可以是单列的也可以是多列的。他们有如下区别
在我的‘xhh’表中存有4个人的信息 ,有2个人姓名相同,3个人年龄相同,2个人的班级相同。
我想查name='zch' and age=23 and class1=1203先考虑建立单个索引,但是单个索引的话,怎么都不能建一个索引一次性找出一条数据。
这样就可以建一个多列索引create index name_age_class on xhh(name,age,class1);
由于索引文件以B-树格式保存,MySQL能够立即转到合适的name,然后再转到合适的age,最后转到合适的class1。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录!那么,如果在name、age、class1这三个列上分别创建单列索引和创建一个name、age、class的多列索引的效果完全不同。当执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于name、age、class1这三个列上的多列索引。
最左前缀:
多列索引还有另外一个优点,它通过称为最左前缀(LeftmostPrefixing)的概念体现出来。
比如我们建的3列索引,就相当于建立了3个索引,对name name,age name,age,class1 3个查询都能索引到
如何选择索引列:
1.在where子句中出现的列建索引
2.join连接的连接字段建立索引
一和主键域非空,数据库管理系统对于主键自动生成唯一的索引,索引主键页是一个特殊的索引。
primary key 和unique key 的区别:
primary key 就是主键索引
unique key 是唯一性索引,
1.主键不能为空,但是unique key 可以为空,两者在表中都是唯一不能重复的值。
2.主键一定是唯一的索引,唯一的索引不一定是主键
3.主键可以被其他的表做外键引用,而索引不能作为外键引用
外键:foreign key 。MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种
(以下3点是查资料查到的)
① 两个表必须是InnoDB表,MyISAM表暂时不支持外键
② 外键列必须建立了索引,MySQL
4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立;
③ 外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
普通索引:索引的创建有3中方式
create table table_name([...] , index [索引名] (列的列名))
create index [索引名] on table (列的列名)
alter table table_name add index [索引名] (列的列名)
唯一性索引的建立就在索引名前加 unique 这个关键字 (唯一性索引,处理字段数据的唯一性,其余的和普通索引一
样)。
全文索引:
MySQL从3.23.23版开始支持全文索引和全文检索。在MySQL中,全文索引的索引类型为FULLTEXT。全文索引可以在varchar或者text类型的列上创建。它可以通过create table命令创建,也可以通过alert table或create
index命令创建。对于大规模的数据集,通过alter table(或者create index)命令创建全文索引要比把记录插入带有全文索引的空表更快。
单列索引和多列索引:
索引可以是单列的也可以是多列的。他们有如下区别
在我的‘xhh’表中存有4个人的信息 ,有2个人姓名相同,3个人年龄相同,2个人的班级相同。
我想查name='zch' and age=23 and class1=1203先考虑建立单个索引,但是单个索引的话,怎么都不能建一个索引一次性找出一条数据。
这样就可以建一个多列索引create index name_age_class on xhh(name,age,class1);
由于索引文件以B-树格式保存,MySQL能够立即转到合适的name,然后再转到合适的age,最后转到合适的class1。在没有扫描数据文件任何一个记录的情况下,MySQL就正确地找出了搜索的目标记录!那么,如果在name、age、class1这三个列上分别创建单列索引和创建一个name、age、class的多列索引的效果完全不同。当执行查询的时候,MySQL只能使用一个索引。如果你有三个单列的索引,MySQL会试图选择一个限制最严格的索引。但是,即使是限制最严格的单列索引,它的限制能力也肯定远远低于name、age、class1这三个列上的多列索引。
最左前缀:
多列索引还有另外一个优点,它通过称为最左前缀(LeftmostPrefixing)的概念体现出来。
比如我们建的3列索引,就相当于建立了3个索引,对name name,age name,age,class1 3个查询都能索引到
如何选择索引列:
1.在where子句中出现的列建索引
2.join连接的连接字段建立索引
相关文章推荐
- mybatis调用mysql存储过程返回结果集
- 12. mysql show status
- MYSQL 启动错误193
- MySQL数据库表名、列名、别名区分大小写的问题
- 使用JMeter创建数据库(Mysql)测试
- MySQL INTO OUTFILE导出导入数据|mysqldump
- MySQL Study之--MySQL体系结构深入解析
- cmake 安装 mysql5.5.44
- 命令行(mysqldump)导出数据库、数据表
- MySQL Study之--MySQL体系结构深入解析
- mysql
- MySQL执行计划解读
- you can't specify target table for update in from clause Mysql 报错
- ubuntu14.04安装MySQL
- mysql处理高并发
- Mysql锁表
- 迁移Windows下的MySQL时字符乱码问题
- mysql 时间函数
- Mysql 性能调优
- 关于MYSQL今天新学的几个知识点