索引类型
1、普通索引
ALTER TABLE tablename ADD INDEX index_name('column')
2、唯一索引
索引列的值必须唯一,但允许有空值,如果是组合索引,则列值的组合必须唯一
ALTER TABLE table_name ADD UNIQUE('column')
3、复合索引
4、主键索引
一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引,一个表只能有一个主键。
ALTER TABLE table_name ADD PRIMARY KEY('column')
5、全文索引
仅能用于MyISAM表,目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引,对于大容量的数据表,生成全文索引非常耗时间、磁盘空间
ALTER TABLE table_name ADD FULLTEXT('column')
索引存储结构
聚集索引
聚集索引是根据数据行的键值在表中排序存储数据行。索引定义中包含聚集索引列。每个表只能有一个聚集索引。只有当表包含聚集索引时,表中的数据行才按排序顺序存储。如果表具有聚集索引,则该表称为聚集表。集索引决定了表数据的存储顺序,如果表没有聚集索引,则其数据行存储在一个称为堆的无序结构中
非聚集索引
非聚集索引并不是在物理上排列数据,即索引中的逻辑顺序并不等同于表中行的物理顺序,索引是指向表中行的位置的指针,这些指针本身是有序的,通过这些指针可以在表中快速定位数据
聚集索引和非聚集索引的根本区别是数据记录的排列顺序和索引的排列顺序是否一致,聚集索引,优点是查询速度快,因为一旦具有第一个索引值的纪录被找到,具有连续索引值的记录也一定物理的紧跟其后,从而缩小了搜索范围,对于返回某一范围的数据效果最好。缺点是对表进行修改速度较慢,这是为了保持表中的记录的物理顺序与索引的顺序一致,而把记录插入到数据页的相应位置,必须在数据页中进行数据重排,降低了执行速度。
在对聚集索引列查询时,聚集索引的速度要比非聚集索引速度快。
在对聚集索引列排序时,聚集索引的速度要比非聚集索引速度快。但是如果数据量比较大时,如10万以上,则二者的速度差别不明显。
特点:
索引存储结构是用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。
散列存储:散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。
散列法存储的基本思想是:由节点的关键码值决定节点的存储地址。散列技术除了可以用于查找外,还可以用于存储。
特点:
散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列
访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现
,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。
索引存储方式
1、B-TREE
B-Tree是一种多路搜索树
2、Hash
只有memory存储引擎支持hash索引,memory的默认索引类型
不同存储引擎下创建索引有何差异(innodb myisam)
MyisAM支持全文索引(FULLTEXT)、压缩索引,InnoDB不支持;
InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的
InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别
MyisAM索引的基数值是精确的,InnoDB则是估计值。
MyisAM处理字符串索引时用增量保存的方式,如第一个索引是‘preform’,第二个是‘preformence’,则第二个保存是‘7,ance’ ,这个明显的好处是缩短索引,但是缺陷就是不支持倒序提取索引,必须顺序遍历获取索引
不同的索引的应用场景
数据多且字段值有相同的值的时候用普通索引
字段多且字段值没有重复的时候用唯一索引
当有多个字段都经常被查询用复合索引
如果表中存在几个字段构成的联合索引,则查找记录时,这个联合索引的最左前缀匹配字段也会被自动作为索引来加速查找。
多表做join操作时会使用索引(如果参与join的字段在这些表中均建立了索引的话)
若某字段已建立索引,求该字段的min()或max()时,MySQL会使用索引
对建立了索引的字段做sort或group操作时,MySQL会使用索引
选择索引的数据类型
1、越小的数据类型更好,越小的数据类型通常在磁盘、内存和CPU缓存中占更少的空间,处理速度快
2、简单的数据类型更好:整形、内置的日期和时间类型、用整形存储IP地址
3、尽量避免NULL
使用索引的注意事项
1、索引不会包含有NULL值的列
只要列中包含有NULL值都不会包含在索引中,符合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的
2、使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的列,如果在前10个或20个字符内,多数值 是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作
3、索引列排序
MySQL查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库 默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引
4、like语句操作
一般情况下不鼓励使用like操作,如果使用like "%aaa%" 不会使用索引而like "aaa%"可以使用索引
5、不要在列上进行运算
6、不使用NOT IN和<>操作