本文主要介绍MySQL 中关于索引的一些问题,例如:索引的作用;怎么创建索引;设计索引的原则;怎么优化索引等等

一:索引概述

索引一般是通过排序,然后查找时可以二分查找,这一特点来达到加速查找的目的的。

所有的MySQL列类型都能创建索引,良好设计的所以能够很好地提高查询的性能,但如果索引过多,由于每次更新操作都会对索引进行更新,反而会影响到数据库的整体性能。因而,遵循一定的原则,设计合适的索引是非常重要的。

(1):创建索引的语法

CREATE [UNIQUE|FULLTEXT|SPQTIAL] INDEX index_name [USING index_type] ON table_name(col_name)

例子:建了一张user表,有属性 name, age, address, 下面图可以看出没建立索引和建立索引时查询的区别。

二:设计索引的几个原则

(1): where子句中的列比select中的列更适合做索引。

(2): 选择那些基数大的列,这要的索引效果更好,这要索引才能很好地区分不同值。

(3): 使用短索引,例如一个char(200)的列,如果前20个字符就能很好的区分不同的值时,就没必要对整个列进行索引,这样可以大大的减少索引的存储空间。

(4): 不要过度索引,只建立所需的索引。过多的索引会浪费磁盘空间,降低写的性能,也会给查询优化带来更多的工作,让MySQL选择不到最好的索引。

(5): InnoDB尽量自己指定主键:InnoDB 引擎存储的表会按照一定的顺序保存,例如主键,唯一索引,如果都没有则会自动生成一个内部列,按照这些进行访问是最快的,所以InnoDB尽量自己指定主键。当有多个列可以作为主键时,选择最常作为访问条件的列作为主键。

例子:InnoDB没创建索引,但建立了主键,会用主键进行查询。

三:BTREE索引和HASH索引

MyISAM 和 InnoDB 默认创建的是BTREE索引,MEMORY引擎默认创建的是Hash索引,BTREE 用于全值匹配,匹配列前缀,范围匹配时非常有效。HASH索引存储的是hash值,并且是所有索引列的Hash值,只能用于精确匹配。

BTREE 的几个限制:

(1). 必须按照索引的最左列开始查找

(2). 不能跳过索引中的列

(3). 某个列使用了范围查询,其右边的列都无法使用索引。

索引列的位置顺序,非常重要,写SQL时需要尤其注意。

HASH索引的几个限制:

(1). hash索引只存储哈希值和行指针,不存储字段值,结构紧凑。

(2). 数据不是按照索引值顺序存储的,所以无法用于排序。

(3). 不支持部分索引列的匹配查找,因为hash值是用所有的索引列计算的。

(4). 只支持精确查找

四:索引的优化

在遵循索引的设计原则后,设计索引和编写SQL时还需要注意索引使用时的几个特点:

(1). 前缀特性 : 当创建了多列索引时,只要用到了前面的列,索引就会起作用。例如创建了两列索引(a,b) ,当where条件语句中仅出现了a,索引也会被使用,但仅仅出现了b,索引将不会被使用。

(2). 使用like查询时,%不能出现在第一个字符,应该是 “ 常量 + %”,这样索引才可能会起作用。

(3). 对大文本进行搜索时,使用全文索引而不是使用 like '%...%, 更好的方法是在BTREE的基础上建立伪Hash索引,仅仅需要对这列计算hash值再存储,可以节省空间。缺陷是需要维护hash值,可以用触发器维护。

(4). 用or分割开的条件,如果or前面的列有索引,后面的列没有索引,那么涉及到索引都不会被用到。

(5). 如果列类型是字符串,记得where条件中把字符串常量值用引号引起来。

查看索引的使用情况,用 show status like 'Handle_read%' 查看Handle_read_key(值大说明索引得到了很好的使用,反之亦然) 和 Handle_read_rnd_next(值很大说明进行了大量的全盘扫描,索引没得到很好地使用) 的值。

MySQL学习笔记(六):索引的更多相关文章

  1. mysql学习笔记--数据库索引

    一.索引的优点:查询速度快 二.索引的缺点: 1. 增.删.改(数据操作语句)效率低了 2. 索引占用空间 三.索引类型: 1. 普通索引 2. 唯一索引(唯一键) 3. 主键索引:只要主键就自动创建 ...

  2. MySQL学习笔记(三)—索引

    一.概述 1.基本概念       在大型数据库中,一张表中要容纳几万.几十万,甚至几百万的的数据,而当这些表与其他表连接后,所得到的新的数据数目更是要大大超出原来的表.当用户检索这么大量的数据时,经 ...

  3. MySQL学习笔记六:基本DML操作

    1.查询语句,语法如下: SELECT [ALL | DISTINCT | DISTINCTROW ] [HIGH_PRIORITY] [STRAIGHT_JOIN] [SQL_SMALL_RESUL ...

  4. MySQL学习笔记-大纲

    软件程序性能测试在之前<品味性能之道>系列中已经大量提到,讲解了很多测试方法.测试观念.测试思想等等.最近准备深入MySQL进行学习并总结.分别查阅<MySQL性能调优与架构设计&g ...

  5. mysql basic operation,mysql总结,对mysql经常使用语句的详细总结,MySQL学习笔记

    mysql> select * from wifi_data where dev_id like "0023-AABBCCCCBBAA" ; 1.显示数据库列表.show d ...

  6. MySQL学习笔记一

    MySQL 学习笔记 一 一.数据库简单介绍 1. 按照数据库的发展时间顺序,主要出现了以下类型数据库系统: Ø 网状型数据库 Ø 层次型数据库 Ø 关系型数据库 Ø 面向对象数据库 上面4中数据库系 ...

  7. Mysql学习笔记(二)数据类型 补充

    原文:Mysql学习笔记(二)数据类型 补充 PS:简单的补充一下数据类型里的String类型以及列类型... 学习内容: 1.String类型 2.列类型存储需求 String类型: i.char与 ...

  8. Mysql学习笔记(一)数据类型

    原文:Mysql学习笔记(一)数据类型 学习内容: Mysql基本数据类型. 1.数字类型.. i.整型     Mysql数据类型             含义(有符号)     tinyint(m ...

  9. 初识mysql学习笔记

    使用VMVirtualBox导入Ubuntu后,可以通过sudo apt-get install mysql-server命令下载mysql. 在学习过程中,我遇到了连接不上Xshell的问题.最终在 ...

随机推荐

  1. top的用法

    top命令可以用来方便地观察当前系统中运行的进程的信息,并可以在运行过程中执行改变进程的优先级.更改排序规则.导出状态信息等操作,非常方便. 1.主要选项 -d:后接秒数,状态更新的秒数,默认5秒-b ...

  2. Java IO学习笔记二

    Java IO学习笔记二 流的概念 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成. 程序中的输入输 ...

  3. Python 基础 (单、双引号区别) 不断补充

    最近开始学习Python ,一些小细节的东西不是很理解,所以就记录一下,方便自己以后查看. 我的Python环境: Mac pro 10.12.3,Python3.5 ,Pycharm 多句题外话:公 ...

  4. 解决微信浏览器禁止链接跳转到iTunes

    方法:微信页面通过safari浏览器打开 safari打开的时候进行跳转 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transition ...

  5. jq-toggle

    jq-toggle: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...

  6. Linux上网问题

    开发板运行linux下和主机Windows互ping这块,就是Windows这边已经显示本地连接上了,从Windows ping Linux 可以通 但是在CRT 上ping Windows就没反应了 ...

  7. 不用EF框架,完成完美实体映射,且便于维护!(AutoMapper,petapoco)

    最近,需要搭建一个新项目,在需求分析时确定数据库中需要创建多个存储过程.所以如果还是用原来EF框架生成ADO.net实体模型的话,不利于修改. 主要是解决以下两个问题: 1.比如前端需要一个值,如果存 ...

  8. Threejs 开发3D地图实践总结

    前段时间连续上了一个月班,加班加点完成了一个3D攻坚项目.也算是由传统web转型到webgl图形学开发中,坑不少,做了一下总结分享. 1.法向量问题 法线是垂直于我们想要照亮的物体表面的向量.法线代表 ...

  9. geotrellis使用(二十九)迁移geotrellis至1.1.1版

    目录 前言 升级过程 总结 一.前言        由于忙着安装OpenStack等等各种事情,有半年的时间没有再亲密的接触geotrellis,甚至有半年的时间没能畅快的写代码.近来OpenStac ...

  10. XML文件的创建和解析笔记

    解析XML的四种方法 XML现在已经成为一种通用的数据交换格式,它的平台无关性,语言无关性,系统无关性,给数据集成与交互带来了极大的方便.对于XML本身的语法知识与技术细节,需要阅读相关的技术文献,这 ...