MySQL索引教程

  什么是索引:    

  索引是一种数据结构,会对添加索引的字段的值进行排序存放,提高查询效率;一张表中可以添加多个索引;innodb存储引擎默认使用的是b+tree索引结构,也支持哈希、全文索引。
  
  innodb存储引擎中的表使用的是索引组织表(IOT);
  
  索引的缺点
  
  ①索引维护成本高(可通过insert buffer,change buffer提升DML语句效率)
  
  ②占用更多的存储空间(磁盘和内存)
  
  ③索引过多会造成优化器负担
  
  应该创建索引的列
  
  在经常查询的列上,可以加快搜索的速度;
  
  在经常需要根据范围(<,<=,=,>,>=,BETWEEN,IN)进行搜索的列上创建索引,因为索引已经排序,可通过叶子节点双向指针快速查找;
  
  在经常需要排序(order by)的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间;
  
  在经常使用在WHERE子句中的列上面创建索引,加快条件的判断速度。
  
  不该创建索引的列
  
  对于那些在查询中很少使用或者参考的列不应该创建索引。
  
  对于那些只有很少数据值或者重复值多的列也不应该增加索引。
  
  对于那些定义为text, image和bit数据类型的列不应该增加索引,造成索引树高度增加、内存空间浪费。
  
  索引最大的长度
  
  默认最大长度767字节;innodb_large_prefix=on 3072字节
  
  b+tree原理

  MySQL索引教程


  
  索引树高度:2
  
  非叶子节点:non leaf page[root page],存字段的值和指针
  
  叶子节点:leaf page,存所有字段的值和指针
  
  指针:指针与页是映射的关系,通过指针就可以找到对应的页;指针可以存放在上一层节点;6字节
  
  页:用于存放数据,16k;innodb_page_size | 16384
  
  双向指针:用于保存相邻页的指针
  
  b+tree:用于存储数据并高效检索数据,是基于页管理数据。
  
  存储数据:数据都是存放叶子节点,并经过排序存放
  
  b+tree删除操作:主要依赖填充因子,默认最小值为50%,如果小于50%,则会发生页合并操作
  
  b+tree插入操作
  
  情况一:叶子节点有空闲,则直接插入数据
  
  情况二:叶子节点已满,则会发生split分裂页操作
  
  情况三:如果叶子节点和其上一层节点都已满,则会发生两次split分裂页操作
  
  创建索引
  
  索引名称 index_name 是可以省略的,省略后,索引的名称和索引列名相同。
  
  -- 创建普通索引
  
  CREATE INDEX index_name ON table_name(col_name);
  
  -- 创建唯一索引
  
  CREATE UNIQUE INDEX index_name ON table_name(col_name);
  
  -- 创建普通组合索引
  
  CREATE INDEX index_name ON table_name(col_name_1,col_name_2);
  
  -- 创建唯一组合索引
  
  CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);
  
  修改表结构创建索引
  
  ALTER TABLE table_name ADD INDEX index_name(col_name);
  
  创建表时直接指定索引
  
  CREATE TABLE table_name (
  
  ID INT NOT NULL,
  
  col_name VARCHAR (16) NOT NULL,
  
  INDEX index_name (col_name)
  
  );
  
  删除索引
  
  -- 直接删除索引
  
  DROP INDEX index_name ON table_name;
  
  -- 修改表结构删除索引
  
  ALTER TABLE table_name DROP INDEX index_name;

MySQL索引教程

上一篇:pymysql连接数据库


下一篇:数据库连接池的使用