索引
什么是索引
索引是帮助数据库高效获取数据的数据结构。索引的实现通常使用B树及其B+树。 为表设置索引要付出代价的:一是增加了数据库的存储空间,二在插入和修改数据时要花费较多的时间(因为索引也要随之变动)
索引的底层如何实现
B-Tree 是最常用的用于索引的数据结构。因为它们是时间复杂度低, 查找、删C-除、插入操作都可以可以在对数时间内完成。另外一个重要原因存储在B-TreeD-中的数据是有序的。 哈希表是另外一种你可能看到用作索引的数据结构-这些索引通常被称为哈希索引。使用哈希索引的原因是,在寻找值时哈希表效率极高。所以,如果使用哈希索引,对于比较字符串是否相等的查询能够极快的检索出的值。
索引的分类:
主键索引:创建在主键上索引
叶子节点存放数据本身 叶子底下存放存放所有的数据
辅助索引:创建在非主键上的索引
叶子节点存放数据本身 只存放了创建索引的属性和主键
单例索引:创建在一个属性上的索引
多列索引:创建在多个属性上的索引
唯一索引:创建在不重复字段的索引 id(主键)主键索引是一个特殊的唯一索引
空间索引:空间属性索引
全文索引:建立字符属性上的索引 支持char ,varchar和text类型的字段上
聚簇型索引:(InnoDB)数据文件和索引文件都存放在 .idb B+叶子节点 ,存放的是数据内存地址-- —》根据地址再去找数据
非聚簇型索引:(MyIsam)
索引的优化:
(1)7个原则(索引的设计原则)
1.选择的唯一性
2.为经常需要排序,分组和联合操作的字段建立索引
3.为常作为where查询条件的字段建立索引
4.尽量使用前缀来索引
5.限制索引的数目
6.删除不再使用或者很少使用的索引(percona toolkit)
7.大表加索引,要在业务不繁忙期间操作
什么时候不使用索引
①查询中很少使用到的列 不应该创建索引,如果建立了索引然而还会降低mysql的性能和增大了空间需求.
②很少数据的列也不应该建立索引,比如 一个性别字段 0或者1,在查询中,果集的数据占了表中数据行的比例比较大,mysql需要扫描的行数很多,增加索引,并不能提高效率
③ 定义为text和image和bit数据类型的列不应该增加索引,
④ 当表的修改(UPDATE,INSERT,DELETE)操作远远大于检索(SELECT)操作时不该创建索引,这两个操作是互斥的关系
1.普通索引
创建索引
CREATE INDEX indexName ON mytable(username(length));
修改表结构(添加索引)
ALTER table tableName ADD INDEX indexName(columnName);
;
创建表的时候直接指定
CREATE TABLE mytable(
ID INT NOT NULL,
Username VARCHAR(16)NOT NULL,
INDEX [indexName] (username(length))
);
删除索引
DROP INDEX [indexName] ON mytable;
唯一索引
创建索引
CREATE UNIQUE INDEX indexName ON mytable(username(length));
修改表结构
ALTER table mytable ADD UNIQUE [indexName](username(length));
创建表的属性方法
CREATE TABLE mytable(
ID INT NOT NULL,
Username VARCHAR(16)NOT NULL,
UNIQUE [indexName] (username(length))
);
索引如何提高查询效率
索引的意义,就在于它只抽取了原记录中的一部分关键的信息,并与记录的位置建立关联,以此定位记录在磁盘上的真正位置。
索引存储的数据较少,更容易被加载到内存中,也就意味着我们可以通过高效的算法在索引上查找目标记录的索引项,得到目标记录在磁盘上的位置,然后直接读取该记录。