标签:临时表 正文 空值 not 汉语 是什么 相同 cluster 高效
查阅书籍及文章,做下记录吧,方便熟悉,以免忘了。
按顺序存贮数据。
哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。对每行数据,存贮引擎都会对所有的索引列计算一个哈希码(较小值)。哈希索引将所有的哈希码存储到索引中,同时在哈希表中保存指向的数据行的指针。
和B-Tree不同,这类索引无需前缀查询。空间索引会从所有维度来索引数据,查询时可以使用任意维度组合查询。 MyISAM支持空间索引,可用作地理数据存贮。
全文索引是一种特殊类型的索引,查找的文本中的关键词,而不是直接比较索引中的值。
在相同列上同事建全文索引和B-Tree索引不会有冲突,全文索引适用于MATCH AGAINST操作,而不是普通通的WHERE条件操作。
B+tree索引分为聚集索引与非聚集索引两大类。
理解聚集索引和非聚集索引可通过对比汉语字典的索引。汉语字典提供了两类检索汉字的方式,第一类是拼音检索(前提是知道该汉字读音),比如拼音为cheng的汉字排在拼音chang的汉字后面,根据拼音找到对应汉字的页码(因为按拼音排序,二分查找很快就能定位),这就是我们通常所说的字典序;第二类是部首笔画检索,根据笔画找到对应汉字,查到汉字对应的页码。拼音检索就是聚集索引,因为存储的记录(数据库中是行数据、字典中是汉字的详情记录)是按照该索引排序的;笔画索引,虽然笔画相同的字在笔画索引中相邻,但是实际存储页码却不相邻。
并不是一种单独的索引类型,而是一种数据存储方式。InnoDB的聚集索引实际是在同一个结构中保存了B-Tree索引和数据行。
一种索引,该索引中键值的逻辑顺序决定了表中相应行的物理顺序。
数据行的物理顺序与列值(一般是主键的那一列,mysql默认主键就是聚集索引)的逻辑顺序相同,一个表中只能拥有一个聚集索引。
特性:
MySQL如果定义主键,那么主键就是聚集索引;
MySQL如果没有定义主键,表中第一个唯一非空索引就作为聚集索引;
MySQL如果没有主键也没有合适的唯一索引,那么innodb内部会生成一个隐藏的主键作为聚集索引,这个隐藏的主键是一个6个字节的列,改列的值会随着数据的插入自增;
使用UUID聚集索引,主键值是乱序的,B-Tree的页数分行,重新排列,频繁的页分裂,变得复杂。
==MySQL的索引分为B+树索引和hash索引与全文索引。MyISAM数据库引擎和InnoDB数据库引擎的索引都是基于B+树的。==
MyISAM、InnoDB引擎、Memory三个常用引擎类型比较
索引 | MyISAM引擎 | InnoDB引擎 | Memory引擎 |
---|---|---|---|
B-Tree 索引 | 支持 | 支持 | 支持 |
HASH 索引 | 不支持 | 支持 | 支持 |
R-Tree 索引 | 支持 | 不支持 | 不支持 |
Full-text 索引 | 不支持 | 暂不支持 | 不支持 |
一种索引,该索引中索引的逻辑顺序与磁盘上行的物理存储顺序不同。
聚集索引与非聚集索引区别
数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。
#创建唯一索引
ALTER TABLE table_name ADD UNIQUE (column);
#创建唯一组合索引
ALTER TABLE table_name ADD UNIQUE (column1,column2);
不允许有空值的唯一索引。(==在B+TREE中的InnoDB引擎中,主键索引起到了至关重要的地位==)
是目前搜索引擎使用的一种关键技术。
ALTER TABLE table_name ADD FULLTEXT (column);
MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
ALTER TABLE table_name add INDEX (column)
在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循==最左前缀==集合
ALTER TABLE table_name INDEX ( column1,column2 )
空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOT NULL。
有时候需要索引很长的字符列,这会让索引变得大且慢。索引开始的部分字符,大大节约索引空间,提高索引效率。
ALTER TABLE table_name ADD INDEX(column(prefix_length));
避免重复索引(列建多个索引)
指索引列不能是表达式的一部分或是某个函数的参数。如:
SELECT * FROM user WHERE age+1=23;
计算合适的前缀长度,并使前缀的选择性接近于完整列的选择性。对于BLOB、TEXT、VARCHAR这些类型的列,必须使用前缀索引,mysql不允许索引这些列的完整长度。
对于联合索引,如何决定索引字段的顺序:
选择性
索引的选择性(==Selectivity==),是指不重复的索引值(也叫基数,Cardinality)与表记录数(#T)的比值:
Index Selectivity = Cardinality / #T
显然选择性的取值范围为(0,1],选择性越高的索引价值越大,这是由B+Tree的性质决定的。
如图:
索引查找数据高效的方式,MySQL也可以根据索引直接获取到数据,这样就不比再去读取数据行。如果一个索引包含了所需要查询字段的值,我们就叫做覆盖索引。(减少了二次查询)
举例:学生成绩表(StudentScore)包含字段:id、username、score、subject;索引 clustered index(id) index(username)
#非聚集索引节点直接获取列数据
SELECT id,username FROM StudentScore WHERE username='小米'
SELECT username FROM StudentScore WHERE username='小米'
#二次查询
SELECT id,username,score FROM StudentScore WHERE username='小米'
MySQL允许在同一列建多个索引。
重复索引是在相同的列上按照相同的顺序创建相同类型的索引。
冗余索引 如创建index(A,B) ,又创建index(A)。大多数情况不需要冗余索引,应尽量扩展已有索引,而不是创建新索引。
索引可以让查询锁定更少的行。
InnoDB在访问行的时候才会对其加锁,索引减少InnoDB访问的行数,从而减少锁的数量,减少锁争用。
《高性能MySQL》书籍
标签:临时表 正文 空值 not 汉语 是什么 相同 cluster 高效
原文地址:https://www.cnblogs.com/followyou/p/9725136.html