前言:

看电子书总走神,看完了也没记住,于是边看边写点东西不会走神,以前手写笔记,后来学了makrdown和gitbooks,然后发现牛客网写markdown更好,还不用gitbooks打包编译托管到gitee了。水平有限,多有不足。

参考书籍:

《高性能Mysql》第三版,《深入浅出mysql 数据库开发、优化管理与维护》唐汉明 第二版

索引基础

索引:index,key,是存储引擎用于快速找到记录的一种数据结构。

  • 索引是一种数据结构。当数据量大的时候,遍历查询一行数据变得缓慢,于是很自然的想到二分查找和哈希查找,二分查找通过建立二分查找树,B树于是被应用,mysql使用B+树,B树叶子节点也存储值,数据量大,B树深度大,查找慢。哈希查找建立哈希表,通过key映射到value,实现o(1)时间查找。于是哈希索引和B+树索引的区别就是哈希表和B+树的区别了。
  • 索引是数据库引擎用于查找,说明索引与数据库引擎相关,Mysql数据库引擎很多,InnoDB,MyISAM,MEMORY是最基本的。InnoDB:支持事务,行锁,B+树索引。MyISAM:不支持事务,表锁,B+树索引。MEMORY:哈希索引,B+树,内存数据库。

    B+树索引

    索引列的顺序相当重要,B+树适用于全键值,键值范围,最左键前缀查找:
  • 全值匹配:与索引所有列进行匹配
  • 匹配最左前缀:只使用索引的第一列
  • 匹配列前缀:只匹配某一列的开头部分
  • 匹配范围值
  • 精确匹配
  • 只访问索引的查询:查询只需要访问索引,不需要访问数据行。
    B-Tree索引使用限制:
  • 如果不是按照索引的最左列开始查找,则无法使用索引。
  • 不能跳过索引的列
  • 如果查询中有某个列范围查询,则其右边所有列都无法使用索引优化查询。

    哈希索引

    哈希索引基于哈希表实现,只适用于精确匹配索引所有列的查询才有效。对每一行数组,对每一个索引列Hash得到哈希码,将哈希码存储在索引中。Mysql中,只有Memory显式的支持哈希索引
    哈希索引限制:
  • 哈希索引只包含哈希值和行指针,不存储字段值,所以不能使用索引值来避免读取行。
  • 哈希索引数据并不是按照索引值顺序存储的,所以无法用于排序。
  • 哈希索引不支持部分索引列匹配查找
  • 哈希索引只支持等值查询
  • 哈希冲突很多的时候,哈希索引维护代价很高。

    空间数据索引

    MyISAM表支持空间索引,用作地理数据存储。

    全文索引

    查找文本关键字,而非索引值。

    索引分类及其创建方式

    索引一般有普通索引:index; 唯一索引 unique index;全文索引:FULLTEXT INDEX; 主键索引:PRIMARY KEY;组合索引:index 多列;
    索引创建有三种创建表时添加,直接创建索引,修改表结构,主键索引一般在创建表时添加。
    # 创建表时添加索引
    create table tablename(
    `id` int not null,
    `username` varchar(32) not null,
    index indexname (username(length))  
    );
    # 创建索引
    create INDEX indexName ON mytable(username(length));
    # 修改表结构
    altertable tableName add INDEX indexName(columnName); 
    # 创建组合索引
    CREATE TABLE mytable ( `id` int(11) , `name` VARCHAR(32) , INDEX index_mytable_id_name (`id`,`name`) );
    # 唯一索引
    CREATE TABLE mytable ( `name` VARCHAR(32) , UNIQUE index_unique_mytable_name (`name`) );
    # 主键索引
    CREATE TABLE mytable ( `id` int(11) NOT NULL AUTO_INCREMENT , `name` VARCHAR(32) , PRIMARY KEY (`id`) );