走第5章 创建高性能的索引
正文:
1.全文索引:
- 在相同的列上同时创建全文索引和基于值的BTree索引不会有冲突,全文索引适用于MATCH AGAINST操作,而不是普通的WHERE条件操作。(后续详解)
2.索引的优点:
- 由于BTree 索引是顺序存储的:大大减少服务器需要扫描的数据量,可以帮助服务器避免排序和临时表,可以将随机I/O变为顺序I/O
3.索引的局限
- 索引的创建是需要额外的存储空间,所以对于特大型的表索引的代价随着数据的增长而增长。这时可以考虑分区技术。
- 小型表简单的全局扫描更高效。
- 索引适合中大型表。
4.高性能的索引策略
- mysql无法使用不是独立的列的索引:索引不能是表达式的一部分,或者是函数的一部分。(select ID from test where id+1=5)
- 索引的列的数据不宜过长过大。(可以考虑使用前面说的自定义哈希索引)
- 对于BLOB、TEXT或者很长的Varchar 必须使用前缀索引来提高索引性能。(匹配前面几个字符);(Alert table xxx ADD key(text(7);前缀索引的弊端是无法进行order by 和group by)
5.选择性:选择性的计算是 不重复的索引列数/总的记录数。(1表示都不重复,例如主键)
6.选择性越高的列作为索引通常会比其他的性能好。
7.在建立多列索引时将选择性较高的放在最左。(可以使用 sum函数来计算某一个列的)
8.聚簇索引:将数据行直接放到叶子页上。数据行和索引的键值对是经凑存储的,所以不能将数据行和第二个 键值一起存储,一张表最多只有一个聚簇索引。
9.聚簇索引极大了提高了I/O性能(直接将数据读取出来,不需要另外的磁盘I/O),更新一行数据的代价提高。
10.覆盖索引:查询的数据都来自索引,只需扫描索引表无须回表
11.可以利用覆盖索引来对表中数据一次筛选,然后在获取所有的列值也是一个不错的优化方案。(select *from A join (select 索引列1 from A where 索引列2=‘’ )as B on B.索引列1 =A.索引列 )
12.避免重复索引:mysql中唯一限制和主键都是通过索引实现的,如果在创建的时候同时使用就会创建重复的索引。主键索引已经包含在二级索引中,无需在创建。
未完待续。。。。。