一、索引

1、分类

(1)主键索引:当一张表的某个字段设置为主键时,该字段就是主键索引;

(2)唯一索引:索引列中的值必须是唯一的,但是允许为空值(可以存在多个null);

(3)普通索引:基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点;

(4)全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你真的是一个好人" 通过“一个好人”,可能就可以找到该条记录。

  在模糊查询中使用全文索引:select * from user where match(name) against ('zhang')  格式: match(列名, ...) against ('搜索的关键字')。

  全文索引中,有一个叫做停止词。因为在一个文本中,创建索引是一个无穷大的数,所以对一些常用词和字符,就不会创建索引,这些词被称为停止词。

2、查询索引

show index(es) from 表名
show keys from 表名

3、为什么建立索引之后查询速度变快?

因为索引使用了二叉树的数据结构,所以速度快;索引文件会占用磁盘空间;创建索引后进行增删改操作就会变慢,因为要重新调整二叉树;

二、索引使用的注意事项

1、在哪些列上适合添加索引?

(1)列比较频繁的作为查询条件,应该创建索引

(2)唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件;

(3)更新非常频繁的字段不适合创建索引;

(4)不会出现在 WHERE 子句中字段不该创建;

2、索引的使用

(1)查询要使用索引最重要的条件是查询条件中需要使用索引;

(2)对于创建的多列索引,只要查询条件使用了索引中最左边的列,索引一般就会被使用;

(3)对于使用 like 的查询,查询如果是 '%aaa' 不会使用到索引,'aaa%' 会使用到索引。

3、不会使用索引的情况:

(1)如果条件中有 OR,即使其中有条件带索引也不会使用;

(2)对于多列索引,不是使用的最左边的列作为条件,则不会被使用;

(3)like 查询以 % 开头,不会使用索引;即在 like 查询时,查询的关键字前面不能使用% (或 _)这样的字符,如果一定前面有变化的值,则考虑全文索引。

(4)如果列类型是字符串,那一定要在条件中将数据使用引号引起来,否则不会使用索引;

(5)如果Mysql 估计使用全表扫描要比使用索引快,则不使用索引;

三、通过 explain 语句分析,mysql 如何执行你的 sql 语句

explain查询sql执行计划,各列含义:
table:表名;
type:连接的类型

-system:表只有一行
    -const:主键、索引。即表最多有一个匹配;
    -eq_reg:主键、索引的范围查找;
    -ref:连接的查找(join)
    -range:索引的范围查找;
    -index:索引的扫描;
    -all:全表扫描;
possible_keys:可能用到的索引;
key:实际使用的索引;
key_len:索引的长度,越短越好;
ref:索引的哪一列被使用了,常数较好;
rows:mysql认为必须检查的用来返回请求数据的行数;
extra:using filesort、using temporary(常出现在使用order by时)时需要优化。
    -Using filesort  额外排序。看到这个的时候,查询就需要优化了
    -Using temporary 使用了临时表。看到这个的时候,也需要优化。

MySQL优化(五) SQL 语句的优化 索引、explain的更多相关文章

  1. Mysql 52条SQL语句性能优化策略汇总

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行null值判断,创建表时NULL是默认值,但大多数时候应 ...

  2. 浅谈mysql配置优化和sql语句优化【转】

    做优化,我在这里引用淘宝系统分析师蒋江伟的一句话:只有勇于承担,才能让人有勇气,有承担自己的错误的勇气.有承担错误的勇气,就有去做事得勇气.无论做什么事,只要是对的,就要去做,勇敢去做.出了错误,承担 ...

  3. MySQL索引详解(优缺点,何时需要/不需要创建索引,索引及sql语句的优化)

     一.什么是索引? 索引是对数据库表中的一列或多列值进行排序的一种结构,使用索引可以快速访问数据库表中的特定信息. 二.索引的作用? 索引相当于图书上的目录,可以根据目录上的页码快速找到所需的内容,提 ...

  4. mysql学习之 sql语句的技巧及优化

    一.sql中使用正则表达式 select name,email from user where email Regexp "@163[.,]com$"; sql语句中使用Regex ...

  5. MYSQL学习笔记——sql语句优化工具

    优化sql:思路: 使用explan->先查询type类型看看是all还是ref,然后判断 possible_keys (显示可能应用在这张表中的索引, 一个或多个.查询涉及到的字段是若存在索引 ...

  6. mysql优化和sql语句优化总结

    mysql性能优化 1. EXPLAIN 你的 SELECT 查询.使用 EXPLAIN 关键字可以让你知道MySQL是如何处理你的SQL语句的.这可以帮你分析你的查询语句或是表结构的性能瓶颈. 2. ...

  7. oracle中sql语句的优化

    oracle中sql语句的优化 一.执行顺序及优化细则 1.表名顺序优化 (1) 基础表放下面,当两表进行关联时数据量少的表的表名放右边表或视图: Student_info   (30000条数据)D ...

  8. SQL语句常见优化十大案例

    1.慢SQL消耗了70%~90%的数据库CPU资源: 2.SQL语句独立于程序设计逻辑,相对于对程序源代码的优化,对SQL语句的优化在时间成本和风险上的代价都很低:3.SQL语句可以有不同的写法: 1 ...

  9. MySQL中的SQL的常见优化策略

    MySQL中的SQL的常见优化策略 MySQL中的索引优化 MySQL中的索引简介 1 避免全表扫描对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索 ...

  10. 52 条 SQL 语句性能优化策略,建议收藏

    本文会提到 52 条 SQL 语句性能优化策略. 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在where及order by涉及的列上建立索引. 2.应尽量避免在where子句中对字段进行nul ...

随机推荐

  1. STM32作为主设备,Arduino作为从设备进行IIC通讯的注意要点

    近日公司的项目重心要往米思齐的Arduino图形化编程上转移了,需要我将STM32和Arduino的IIC通讯调通.之前Arduino并没怎么使用过,仅仅是将超声波的代码移植成TOF激光测距而已.网上 ...

  2. Python基础------运算符

    运算符类型 算数运算符 +   加               -    减              *    乘              /    除              %取余     ...

  3. 用到的linux命令

    1.修改文件权限 chmod 777 文件路径 修改文件下所有文件权限 chmond -R 777 文件路径 2.修改文件 (保存文件的方法,在命令行窗口 shift+:换出底部命令行, q表示退出, ...

  4. python:数据类型list

    一.列表list list是python中基础的数据类型之一,它是以[ ]括起来,每个元素以逗号隔开,而且他里面可以存放各种数据类型 li = ['alex', 123, True, (1, 2, 3 ...

  5. [UE4]添加手柄

    一.在上一节的VRPawnBase中,再添加2个Motion Controller,分别命名为:LeftMotionController.RightMotionController,分别代表左右手柄. ...

  6. 读书笔记——《redis入门指南(第2版)》第四章 进阶——4.1-5

    .1事务 redis中事务是一组命令的集合. 事务同命令一样都是redis的最小执行单位,Redis保证一个事务中的命令要么都执行,要么都不执行.如果redisClient在发送EXEC命令前掉线,则 ...

  7. 读书笔记——《redis入门指南(第2版)》第三章 入门

    3 .redis的5种数据类型及相应命令 redis不区分命令大小写. string 512m 一个散列类型键可包含至多232-1个字段 一个列表类型键最多能容纳232-1个元素 一个集合类型键最多能 ...

  8. IDEA2016 maven项目配置Junit

    添加插件:File->Settings->Plugins 设置生成模式:File->Settings->Other Settings 修改模板:File->Setting ...

  9. Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错

    错误原理实例如下: class One(): list = [1, 2, 3] @classmethod def get_copy_list(cls): # copy一份list,这样对list的改变 ...

  10. SpringMVC 启动流程

    首先看一下Web应用部署初始化过程 (Web Application Deployement),官方文档说明: Web Application Deployment When a web applic ...