索引设计的原则(场景):
1:最适合索引的列是出现在where条件语句的列或者是连接子句指定的列,而不应该是select关键字后面的列;
2:使用唯一索引,考虑应该是:索引的列的基数越大,索引的效果越好,如果索引建在性别列,就没有意义了,因为无论搜索哪个值,都会得到大约一半的行
3:使用短索引,如果对字符串进行索引,应该制定一个前缀长度,只要有可能,就应该这样做。例如有一个char(100)列,如果在前10个或20个字符内,多数值是唯一的,那么就不需要对整个列进行索引。这是因为使用前10个或20个字符进行索引可以节省大量索引空间
4:不要过度使用索引,每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能
索引的分类:
MEMORY存储引擎的表可以选择使用BTREE索引或者HASH索引,两种不同类型的索引有其不同的使用范围
Hash索引优点:
Hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像B-Tree 索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 Hash 索引的查询效率要远高于 B-Tree 索引。
Hash索引缺点: 那么不精确查找呢,也很明显,因为hash算法是基于等值计算的,所以对于“like”等范围查找hash索引无效,不支持;
索引相关常用的sql语句:
CREATE INDEX indexname ON tablename(column_name):建立索引
DROP INDEX indexname ON tablename 删除索引
SHOW INDEX FROM tablename:查找表中的索引的属性,属性字段有:· Non_unique 如果索引不能包括重复词,则为0。如果可以,则为1。
Key_name 索引的名称。
Seq_in_index 索引中的列序列号,从1开始。
Column_name 列名称
Cardinality索引中唯一值的数目的估计值。通过运行ANALYZE TABLE或myisamchk -a可以更新。基数根据被存储为整数的统计数据来计数,所以即使对于小型表,该值也没有必要是精确的。基数越大,当进行联合时,MySQL使用该索引的机 会就越大。
Packed指示关键字如何被压缩。如果没有被压缩,则为NULLNull如果列含有NULL,则含有YES。如果没有,则该列含有NOIndex_type用过的索引方法(BTREE, FULLTEXT, HASH, RTREE)。