Mysql索引学习

##什么是索引数据库

索引是一种文件,一种特殊的文件,索引文件中存放整张表全部记录的引用指针,至关于书本的目录。数据库设计

  • 当没有索引时,数据库查找记录就是便利整张表的记录
  • 存在索引时数据库查询先从相应的索引中查找符合条件的项

索引种类

  1. 聚簇索引

聚簇索引是按照数据存放的物理位置为顺序的性能

  1. 非聚簇索引

非聚簇索引,叶级页指向表中的记录,记录的物理顺序与逻辑顺序没有必然联系测试

聚簇索引相对来讲对于多行索引的性能提升比较大,而非聚簇索引对于单行检索比较快优化

索引的分类

  1. 普通索引(INDEX) 最基本的索引,无任何限制,MyISAM中默认BTREE类型索引设计

  2. 惟一索引(UNIQUE) 与普通索引相似,但惟一索引的索引列的值必须惟一,容许空值,若为组合索引,列值组合必 须惟一指针

  3. 全文索引(FULLTEXT) 仅可用于MyISAM引擎的表,在生成全文索引时数据库将会吧文本中出现的全部单词建立为一 份清单,查询操做将会根据这份清单去检索有关的数据记录,可是对于大容量的数据表,生成 全文索引是一种很是消耗时间与存储空间的作法code

  4. 单列索引、多列索引 多个单列索引与与单个多列索引查询效果不一样,执行查询时MySQL只能使用一个索引,会从多 个索引中选择一个限制最为严格的索引排序

  5. 组合索引(最左前缀) 组合索引时从最左面开始组合,组成一组组索引,例如索引

    ALTER TABLE article ADD INDEX index_time_time(title(50),time(10))

    那么此时至关于创建了如下两组索引

    • title,time
    • title 使用到上面的索引的查询语句以下
    SELECT * FROM article WHERE title='测试' AND time=123456789;
    SELECT * FROM article WHERE title='测试';

    不使用上面的索引的查询语句以下

    SELECT * FROM article WHERE time=123456789;

索引虽然能提升MySQL的查询速度,可是当咱们进行insert、update、delete等写操做时,速度会有所下降,由于在写数据时一样须要更新保存索引文件。

索引的优化

动做描述 使用汇集索引 使用非汇集索引
常常被分组排序 使用 使用
返回某一范围内的数据 使用 不使用
一个或极少不一样值 不使用 不使用
小数目的不一样值 使用 不使用
大数目的不一样值 不使用 使用
频繁更新的列 不使用 使用
外键列 使用 使用
主键列 使用 使用
频繁修改索引列 不使用 使用
  1. 使用短索引 对串列进行索引,若是可能应该指定一个前缀长度。例如,若是有一个CHAR(255)的列, 若是在前10个或20个字符内,多数值是唯一的,那么就不要对整个列进行索引。短索引不只可 以提升查询速度并且能够节省磁盘空间和I/O操做
  2. 索引不会包含有NULL值的列 只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那 么这一列对于此复合索引就是无效的。因此咱们在数据库设计时不要让字段的默认值为NULL
  3. 索引列排序 MySQL查询只使用一个索引,所以若是where子句中已经使用了索引的话,那么order by 中的列是不会使用索引的。所以数据库默认排序能够符合要求的状况下不要使用排序操做;尽可能不要包含多个列的排序,若是须要最好给这些列建立复合索引
  4. like语句操做 通常状况下不鼓励使用like操做,若是非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可使用索引
  5. 不要在列上进行运算 例如:
    select * from users where YEAR(adddate)<2007;
    将在每一个行上进行运算,这将致使索引失效而进行全表扫描,所以咱们能够改为:
    select * from users where adddate<’2007-01-01′;
    关于这一点能够围观:一个单引号引起的MYSQL性能损失
  1. MySQL将全部数据逻辑存放与ibdata1文件中,该文件也被称为表空间,表空间又划分非段(数据段,索引段,回滚段),每一个段又划分为区,每一个区大小为1M,InnoDB每次最多只能申请4个区,即4M,每一个区分为64页,每页16KB,这个大小是固定的
  2. InnoDB 是面向行的,也意味着数据行将存放与页中,每页最多7992行
相关文章
相关标签/搜索