一. 本章介绍mysql中的索引的分类,存储,使用方法的介绍

  1.  索引的存储分类
  MyISAM存储引擎的表的数据和索引是自动分开存储的,各自是独立的一个文件, innodb 存储引擎的表的数据和索引是存储在同一个表空间里面,可以有多个文件组成。 MyISAM和Innodb存储引擎都支持btree索引,memory/heap存储引擎支持hash和btree索引。

  2. mysql如何使用索引
查询要使用索引最主要的条件是查询条件中需要使用索引关键字,如果是多列索引,那么只有索引条件使用了多列关键字最左边的前缀时,才可以使用索引,否则不能.

  (1) 创建多列索引

 -- 多列索引又叫复合索引  创建city表的多列
CREATE INDEX ix1 ON city(cityname(10),citycode);
-- 使用cityname进行查询,发现即使不使用citycode也能使用到索引,这就是索引前缀的特性
EXPLAIN SELECT * FROM city WHERE cityname=''

-- 使用citycode进行查询,就没有使用索引
EXPLAIN SELECT * FROM city WHERE citycode=''

  (2) 使用like
    需要使用模糊查询时, 建了索引的字段 %必须放在关键词后面

 -- 如下所示
EXPLAIN SELECT * FROM city WHERE cityname LIKE '12%'

  (3) 使用条件is null
    如果列名是索引,那么使用is null 会使用到索引

  -- 如下所示
EXPLAIN SELECT * FROM city WHERE cityname IS NULL

  

  3. 存在索引但不会使用到索引 原因如下4点:

(1) 使用索引比全表扫描更慢,则不使用索引。 比如key分布在1到100之间,使用索引 key>1 and key<90 。
(2) 使用memory/heap表 使用where条件不使用 = 进行查询时,那么不会用到索引。
(3) 用or分割开的条件, 如果or 前面条件中列有索引,or后面列没有索引,那么索引不会被用到,如下所示:

 --  country_id 列是索引  citycode不是索引
EXPLAIN SELECT * FROM city WHERE country_id=2 OR citycode=''

--  country_id 列是外键索引  city_id主键索引
EXPLAIN SELECT * FROM city WHERE country_id=2 OR city_id=2 (发现key也是为空?后面在分析)

  (4) 列类型是字符串时,条件值需加引号,不然用不到索引

--  没有加引号,需要用到索引
EXPLAIN SELECT * FROM city WHERE cityname=22

mysql 开发进阶篇系列 3 SQL 优化(索引使用方法)的更多相关文章

  1. mysql 开发进阶篇系列 2 SQL优化(explain分析)

    接着上一篇sql优化来说 1. 定位执行效率较低的sql 语句 通过两种方式可以定位出效率较低的sql 语句. (1) 通过上篇讲的慢日志定位,在mysqld里写一个包含所有执行时间超过 long_q ...

  2. mysql 开发进阶篇系列 4 SQL 优化(各种优化方法点)

    1 通过handler_read 查看索引使用情况 如果索引经常被用到 那么handler_read_key的值将很高,这个值代表了一个行被索引值读的次数, 很低的值表明增加索引得到的性能改善不高,索 ...

  3. mysql 开发进阶篇系列 5 SQL 优化(表优化)

    一. 使用sql提示 sql 提示(sql hint)是优化数据库的一个重要手段, 是在sql语句中加入一些人为的提示来达到优化操作的目的. 1.1 use index 在查询语句中表名的后面,添加u ...

  4. mysql 开发进阶篇系列 1 SQL优化(show status命令)

    一.概述 随着上线后,数据越来越多,很多sql语句开始显露出性能问题,本章介绍在mysql中优化sql语句的方法.  1.  通过show status 命令了解各种sql的执行频率 通过show [ ...

  5. mysql 开发进阶篇系列 23 应用层优化与查询缓存

    一.概述 前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小. 1. 使用连接池 对于访问数据 ...

  6. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  7. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)

    一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...

  8. mysql 开发进阶篇系列 55 权限与安全(安全事项 )

    一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...

  9. mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)

    一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...

随机推荐

  1. html 页面 判断第一个反应的网站并进行跳转 模仿CDN

    <!DOCTYPE html><html><head><meta charset="gb2312"><meta http-eq ...

  2. SRILM的使用及平滑方法说明

    1.简介 SRILM是通过统计方法构建语言模型,主要应用于语音识别,文本标注和切分,以及机器翻译等. SRILM支持语言模型的训练和评测,通过训练数据得到语言模型,其中包括最大似然估计及相应的平滑算法 ...

  3. java 基本原则

    开闭原则:当应用的需求改变时,在不修改软件实体的源代码或者二进制代码的前提下,可以扩展模块的功能,使其满足新的需求. 可以通过“抽象约束.封装变化”来实现开闭原则,即通过接口或者抽象类为软件实体定义一 ...

  4. 剑指offer PART 2

    剑指offer PART 2 书点击自取 提取码: njku 标签(空格分隔): 笔记 C++知识点: 1.面向对象的特性 2.构造函数 3.析构函数 4.动态绑定 5.常用的设计模式 6.UML图 ...

  5. free mybtis plugin

    dao接口与mapper.xml的互相跳转

  6. ADO.NET学习笔记(1)

    ADO.Net是.Net框架中为数据库的访问而封装的一个库.通过这个库我们可以简单便捷的访问数据库,并对数据库进行一些增删改查的操作,目前ADO.Net支持四种主流的数据库,分别是SQL.OLE DB ...

  7. css之absolute温习

    1.absolute:生成绝对定位的元素,相对于 static 定位以外的第一个父元素进行定位.(父元素不仅可以是相对定位(relative)) 2.当绝对定位的元素找不到定位类型是非static定位 ...

  8. <笔记>TP5的分页传递额外参数

    默认生成的分页只有page一个参数,若需要提供额外的参数才能访问分页(例如查询结果的分页,需要传入查询关键字的参数才能显示结果),则需要设置额外参数query

  9. 如何更改github工程的语言属性

    当创建github项目的时候,github本身会根据提交文件的数量来自动推断工程的开发语言,有时这种推断结果会与实际情况不太相符.比如上传一个java的web工程,如果在工程里存在大量的html.ja ...

  10. 从git远程仓库Checkout项目到本地

    一.登录coding  并且项目已创建好  已经是项目的组员 二.打开idea 1.弹出如下页面  复制远程项目上的SSH(URL)到下框URL 并且Test测试 成功就Clone即可 2.Clone ...