所有MySQL列类型都可以被索引,对相关列使用索引是提高SELECT操作性能的最佳途径。根据存储引擎可以定义

每个表的最大索引数和最大索引长度,每种存储引擎(如MyISAM、InnoDB、BDB、MEMORY 等)对每个表至少支持16

个索引,总索引长度至少为256 字节。

一、索引创建、查询与删除

1. 索引创建

索引可以在创建表的时候同时创建,也可以使用alter table命令或create index命令随时增加新的索引。

create index命令语法:

CREATE [UNIQUE|FULLTEXT|SPATIAL] INDEX index_name

[USING index_type]

ON tbl_name (index_col_name,...)

参数解析:

index_type:

btree、hash...

index_col_name:

col_name [(length)] [ASC | DESC]

前缀索引创建实例:

create index ind_company2_name on company2(name(4));

复合索引创建实例:

create index ind_sales2_companyid_moneys on sales2(company_id,moneys);

2. 索引查询:

show index from tbl_name;

show keys from tbl_name;

3. 索引删除:

drop index index_name on tbl_name;

二、索引存储分类

MySQL 中索引的存储类型目前只有两种(BTREE 和HASH),具体和表的存储引擎相关:MyISAM 和InnoDB 存储引

擎都只支持BTREE 索引;MEMORY/HEAP存储引擎可以支持HASH和BTREE 索引(Memory存储引擎默认使用HASH索引)。

Mysql目前还不支持函数索引,但是支持前缀索引,即对索引字段的前N个字符创建索引。

MyISAM 存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件;InnoDB存储引擎的表的数据和

索引是存储在同一个表空间里面,但可以有多个文件组成。

BTREE索引和HASH索引的差异:

(1)HASH索引只用于使用=或<=>操作符的等式比较。如果一定要使用范围查询的话,只能使用BTREE索引。

(2)优化器不能使用Hash索引来加速order by操作。

(3)使用Hash索引时MySQL不能确定在两个值之间大约有多少行。如果将一个MyISAM表改为的Hash索引memory表,

会影响一些查询的执行效率。

(4)Hash索引只能使用整个关键字来搜索一行。

三、索引设计的原则

1. 最适合索引的列是出现在where子句中的列,或连接子句中指定的列。

2. 使用唯一索引。索引的列的基数越大,索引的效果越好。

3. 使用短索引。如果对字符串列进行索引,应该指定一个前缀长度,这样可以节省大量索引空间,也可能会使查询更快。

4. 利用最左前缀。在创建一个n列的索引时,实际上是创建了MySQL可利用的n个索引。多列索引可起几个索引的作用,

因为可利用索引中最左边的列集来匹配行。这样的列集称为最左前缀。

5. 不要过度索引。每个额外的索引都要占用额外的磁盘空间,并降低写操作的性能。

6. 对于InnoDB存储引擎的表,记录默认会按照主键或唯一索引或内部列的顺序保存。按照主键或者内部列进行的访问是

最快的,所以要选择最常作为访问条件的列作为主键,提高查询的效率。InnoDB表的普通索引都会保存主键的键值,所

以主键要尽可能选择短的数据类型,可以有效地减少索引的磁盘占用,提高索引的缓存效果。

四、索引使用

1. 使用索引

(1)对于多列索引,只要查询的条件中用到了最左边的前缀,索引一般就会被使用。

(2)对于使用like 的查询,后面如果是常量并且只有%号不在第一个字符,索引才可能会被使用,如果如果like 后面跟

的是一个列的名字,那么索引也不会被使用。

(3)如果对大的文本进行搜索,使用全文索引而不用使用like ‘%…%’。

(4)如果列名是索引,使用column_name is null 将使用索引。

2. 存在索引但不使用索引

(1)如果MySQL估计使用索引比全表扫描更慢,则不使用索引。

(2)如果使用MEMORY/HEAP 表并且where 条件中不使用“=”进行索引列,那么不会用到索引。heap 表只有在“=”的

条件下才会使用索引。

(3)用or分割开的条件,如果出现一个条件的列没有索引的话,那么涉及到的索引都不会被用到。

(4)对于复合索引,如果条件中不是索引列的前缀,索引也不会被用到。

(5)使用like的查询如果后面的常量是以%开头,不会使用索引。

(6)如果列类型是字符串,那么一定记得在where 条件中把字符常量值用引号引起来,否则的话即便这个列上有索引,

MySQL 也不会用到的,因为,MySQL默认把输入的常量值进行转换以后才进行检索。

3. 查看索引的使用情况

show status like 'Handler_read%';

如果索引正在工作,Handler_read_key 的值将很高,这个值代表了一个行被索引值读的次数,很低的值表明增加

索引得到的性能改善不高,因为索引并不经常使用。Handler_read_rnd_next 的值高则意味着查询运行低效,并且应

该建立索引补救。这个值的含义是在数据文件中读下一行的请求数。如果正进行大量的表扫描,Handler_read_rnd_next

的值较高,则通常说明表索引不正确或写入的查询没有利用索引。

4. 使用SQL提示

(1)use index

在查询语句中表名的后面,添加use index来可以提供希望MySQL 去参考的索引列表,就可以让MySQL不再考虑其

他可用的索引。

使用示例:

select * from sales2 use index (ind_sales2_id) where id = 3;

(2)ignore index

让MySQL忽略一个或多个索引。

(3)force index

强制Mysql使用一个特定的索引。

MySQL索引(1)的更多相关文章

  1. 深入MySQL索引

    MySQL索引作为数据库优化的常用手段之一在项目优化中经常会被用到, 但是如何建立高效索引,有效的使用索引以及索引优化的背后到底是什么原理?这次我们深入数据库索引,从索引的数据结构开始说起. 索引原理 ...

  2. MySQL 索引

    MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度. 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL就是 ...

  3. MYSQL索引结构原理、性能分析与优化

    [转]MYSQL索引结构原理.性能分析与优化 第一部分:基础知识 索引 官方介绍索引是帮助MySQL高效获取数据的数据结构.笔者理解索引相当于一本书的目录,通过目录就知道要的资料在哪里, 不用一页一页 ...

  4. MySQL索引原理及慢查询优化

    原文:http://tech.meituan.com/mysql-index.html 一个慢查询引发的思考 select count(*) from task where status=2 and ...

  5. 【转】MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  6. [转]MySQL索引背后的数据结构及算法原理

    摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...

  7. MySQL索引类型总结和使用技巧以及注意事项

    索引是快速搜索的关键.MySQL索引的建立对于MySQL的高效运行是很重要的.下面介绍几种常见的MySQL索引类型 在数据库表中,对字段建立索引可以大大提高查询速度.假如我们创建了一个 mytable ...

  8. MySQL索引背后的数据结构及算法原理【转】

    本文来自:张洋的MySQL索引背后的数据结构及算法原理 摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持 ...

  9. mysql索引总结----mysql 索引类型以及创建

    文章归属:http://feiyan.info/16.html,我想自己去写了,但是发现此君总结的非常详细.直接搬过来了 关于MySQL索引的好处,如果正确合理设计并且使用索引的MySQL是一辆兰博基 ...

  10. Mysql 索引实现原理. 聚集索引, 非聚集索引

    Mysql索引实现: B-tree,B是balance,一般用于数据库的索引.使用B-tree结构可以显著减少定位记录时所经历的中间过程,从而加快存取速度.而B+tree是B-tree的一个变种,My ...

随机推荐

  1. Mysql双机热备配置(超详细多图版)

    一.双击热备介绍 1.基本概念 双机热备特指基于高可用系统中的两台服务器的热备(或高可用),双机高可用按工作中的切换方式分为:主-备方式(Active-Standby方式)和双主机方式(Active- ...

  2. Log Reservation

    本文是在阅读<SQL Server Transaction Log Management>的Chapter 2: Log Internals时发现以往对Log Grows的理解比较片面,大 ...

  3. Eclipse 多行复制并且移动失效

    Eclipse  有个好用的快捷键  即 多行复制 并且移动 但是 用 Win7 的 电脑 的 时候 发现屏幕 在 旋转 解决方案: 打开Intel的显卡控制中心 把旋转  的 快捷键 进行更改 就好 ...

  4. 深入理解计算机系统chapter8

    进程轮流使用处理器 父进程调用fork来创建一个新的子进程 回收子进程 waitpid/wait 非本地跳转:

  5. 自定义流程gooflow2.0+自定义表单

    一.功能简介 gooflow功能清单1.自定义流程绘制2.自定义属性添加3.支持3种步骤类型普通审批步骤自动决策步骤手动决策步骤 4.决策方式(支持js决策,sql语句决策) 5.审批人员参与方式,可 ...

  6. pygame_第一个窗口程序

    ####可以使用python自带的IDLE交互式开发,也可以借助其他的编辑器,我这里采用的pycharm编辑器 1.导入我们所需要的模块 import pygame,sys   --导入我们需要的模块 ...

  7. 关于 String 自我理解

    String 的一些认识: String对象是不可变,所以使用 final 修饰 字符串拼接,合理利用 StringBuilder(线程非安全),StringBuffer 线程安全 常用方法就不详细介 ...

  8. GitHub Desktop客户端打开文件乱码问题解决方案

    今天在使用GitHub Desktop客户端的时候,发添加本地仓库后文件内容显示为乱码. 1.现象  如下图所示: 2.原因分析 后来分析得知原来是由于编码不统一造成 的. 具体来说,我在window ...

  9. 小白学Maven第一篇配置

    在百度上搜Maven进入官网,然后在进Download里面把apache-maven-3.5.0-bin.zip(记得不要下错)下载下来 然后进行安装 (前提你配置了Java如下图) Java配置: ...

  10. Spring3实战第二章第一小节 Spring bean的初始化和销毁三种方式及优先级

    Spring bean的初始化和销毁有三种方式 通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法: 优先级第二通过 <bean& ...