数据库索引总结

181 阅读4分钟

1.什么是索引

索引是存储引擎快速查找记录的一种数据结构。

2.索引类型

查看索引:show index from table_name;

1、 主键索引 primary key

一种特殊的唯一索引,不允许空值,一个表只能有一个主键。

2、 唯一索引 unique

唯一索引的列值必须是唯一的,但允许空值。如果是组合索引,则列值组合必须是唯一。

Alter table table_name add unique(column);

Alter table table_name add unique(column1, column2);

3、 普通索引 index

Alter table table_name add index(column);

4、 组合索引

Alter table table_name add index(column1,column2);

5、 全文索引

Alter table table_name add fulltext(column);

索引一经创建,则不能修改,如果需要修改索引,则只能删除重建。

删除索引:drop index index_name on table_name;

Alter table table_name drop index index_name;

3.索引设计原则

1、 适合索引的列出现在where字句中的列,或者链接字句中指定的列

2、 基数较小的类,索引效果较差

3、 使用短索引,如果需要对长字符串列进行使用,应该指定一个前缀长度,这样能够节省大量索引空间

4、 不要过度使用索引。索引需要额外的磁盘空间,并降低写操作性能。在修改表内容的时候,索引会进行更新甚至重构,索引列越多,更新时间越长。所以只保持需要的索引有利于查询即可。

4、存储引擎MyISAM和InnoDB区别

1、存储结构 MyISAM: 在磁盘上存储三个文件。.frm文件存储表定义,.MYD文件存储数据,.MYI文件存储索引。

InnoDB: 所有数据存储在一个文件中。

2、存储空间 MyISAM: 可被压缩,存储空间较小。

InnoDB: 需要更多的内存和存储,他会在主内存中建立其专用的缓冲池用于高速缓存数据和索引。

3、可移植性、备份及恢复 MyISAM: 数据以文件形式存储,在跨平台数据转移中会较方便。在备份和恢复时可单独针对某个表进行操作。

InnoDB: 免费的方案可以拷贝数据文件、备份binlog,或者使用mysqldump,在数据达到几十G时,操作较慢。

4、事务支持 MyISAM: 不提供事务支持。强调的是性能,每次查询都是原子性,执行速度较快。

InnoDB: 提供事务支持,外键等高级数据库功能。

5、表锁差异 MyISAM: 只支持表级锁

InnoDB: 支持行级锁。 InnoDB行锁,只在where主键是有效的,非主键的where都会锁住全表。

6、全文索引 MyISAM:支持FULLTEXT类型的全文索引。

InnoDB:不支持FULLTEXT全文索引,但innodb可以使用sphinx插件支持全文索引,并且效果更好。

7、表主键 MyISAM:允许没有任何索引和主键的表存在,索引都是保存行的地址

InnoDB:如果没有设定主键或者非空唯一索引,就会自动生成一个6字节的主键(用户不可见),数据是主索引的一部分,附加索引保存的是主索引的值。

8、表的具体行数 MyISAM:保存有表的总行数,select count() from table;会直接取出该值

InnoDB:没有保存表的总行数,如果使用select count就会遍历整个表,消耗较大,但如果加了where条件后,两种引擎处理方式一致。

9、外键 MyISAM: 不支持

InnoDB:支持

5、其他问题

1、索引最左前缀匹配原则 即最左优先,在检索数据时从联合索引最左边 开发匹配。

2、聚簇索引和非聚簇索引 聚簇索引的叶子节点是数据节点,而非聚簇索引叶子节点还是索引,该索引是指向数据的指针。

3、什么场景下索引会失效 1)在索引列上做操作(计算、函数、自动/手动类型转换)

2)不能继续使用索引中范围条件(between、<、>、in等)右边的列

3)使用不等于判断时会全表扫描(!= 或 <>)

4)索引字段使用null判断时,会导致全表扫描

5)索引字段使用like以通配符(%字符串)时,会导致全表扫描

6)使用字段为字符串,不使用引号,导致全表扫描

7)索引字段使用Or,会导致全表扫描