index优化

  • 对于频繁作为查询条件的字段使用索引
  • 注意索引字段类型的隐式转换,数据库类型和应用类型要一致

索引的种类

  • 唯一索引,成为索引的列不能重复
  • 单列索引,一个索引只包含一列
  • 单列前缀索引,有些列较长,不宜使用全长作为索引,可以截取列前面一部分作为索引
  • 复合索引(某几列也可以是前缀索引),一个索引包含几个列,复合索引满足最左匹配原则

几个名称

聚簇索引

innodb默认会创建聚簇索引(使用主键聚集数据;如果没有主键,innodb选择一个唯一的非空索引替代;如果没有索引innodb隐式定义一个主键作为聚簇索引),就是将数据按照一个或者多个列排序,然后存储在磁盘上,使用BTree数据结构存储索引,聚簇索引的叶子节点就是数据节点
优点:

  1. 将相关数据聚集存储,减少IO。比如按照用户id聚集数据,从磁盘读取较少的数据页就可以或者某个用户的全部邮件
  2. 数据访问更快,因为索引和数据行存储在一起
  3. 覆盖索引扫描的查询可以直接使用叶子节点中的主键值

缺点:

  1. 提高的是IO密集型应用,如果数据全部放在内存中,聚簇索引就没有优势了
  2. 插入速度严重依赖插入顺序。新插入行或者更新主键的时候性能较差,建议一般使用int自增(因为聚簇索引是有序的,如果插入是随机的,则会造成频繁的页分裂,如果使用自增的话,插入总是在最后位置插入,不引起原有顺序的破坏)的主键
  3. 更新聚簇索引列的代价很高,innodb强制将更新的行移动到新的位置
  4. 聚簇索引可能导致全表扫描变慢,尤其是行比较稀疏,或者由于页分裂导致数据存储不连续的时候
  5. 二级索引,也就是非聚簇索引,需要查找两次,而且二级索引的叶子节点包含了主键列,可能导致二级索引较大

非聚簇索引

innodb,也就是二级索引,叶子节点

辅助索引

在聚簇索引之上创建的索引称为辅助索引,辅助索引需要二次查找,叶子节点存储的是主键值,再通过主键值找到数据行的数据页,再通过数据页中的Page Directory找到数据行

覆盖索引

如果索引包含所有满足查询需要的数据,那么这个索引称为覆盖索引,也就是常说的不回表操作。在explain的时候,extra字段是Using index表示就是覆盖索引

高性能的索引策略

  • 独立的列:索引列不能使表达式的一部分、函数的参数
  • 前缀索引和索引选择性:索引选择性是指,不重复的索引值 / 数据表的总记录数。唯一索引的选择性是1,也就是最好的选择性。一般来说接近n就可以了(n = select count(distinct cloumn) / count(id) from table_name)
  • 多列索引:在where条件里使用多个条件的时候,如果每个字段创建各自的索引,mysql会使用union优化。optimizer_switch:控制索引合并
  • 多列索引的顺序:BTree存储使用的是顺序存储。在不考虑分组和排序的情况下,将选择性最高的索引放在最前面,还有要考虑每个字段对应值得分布,比如a、b两个字段,a有30个,b有3000个,那么创建索引的时候肯定是a在前。
  • 聚簇索引
  • 覆盖索引
  • 冗余和重复索引,删除重复索引
  • 未使用的索引,删除未使用的索引
  • 索引和锁,索引可以让查询锁定更少的行,因为通过索引会过滤掉一些行,只会回到表中查询过滤剩下的行,只会锁定这些行

维护索引和表

找到并修复损坏的表

  1. check table
  2. repair table
  3. alter table test engine=innodb,alter table不做任何操作
  4. 先导出数据,再导入新表
  5. 使用其他工具

更新索引统计信息

  1. analyze table,重新生成统计信息,因为优化器会根据统计信息衡量成本
  2. show index from table_name,查看table_name表的统计信息,会触发系统更新统计信息,给系统带来额外的压力
  3. infomation_schema.statistics

减少索引和数据碎片

  • 行碎片(innodb不会出现,因为innodb会移动短小的行并重写到一个片段中)
  • 行间碎片
  • 剩余空间碎片
    以上三种情况myisam都会出现

通过optimize table整理数据
innodb可以通过先删除索引再生成索引的方法消除碎片
对于不支持optimize table的引擎可以通过no-op的alter table重建表来消除碎片

explain

type

  • index:使用索引扫描来排序

extra

  • using index:覆盖索引

高性能Mysql笔记 — 索引的更多相关文章

  1. 高性能MySQL笔记 第5章 创建高性能的索引

    索引(index),在MySQL中也被叫做键(key),是存储引擎用于快速找到记录的一种数据结构.索引优化是对查询性能优化最有效的手段.   5.1 索引基础   索引的类型   索引是在存储引擎层而 ...

  2. 高性能MySQL之索引深入原理分析

    一.背景 我们工作中经常打交道的就是索引,那么到底什么是索引呢?例如,当一个SQL查询比较慢的时候,你可能会说给“某个字段加个索引吧”之类的解决方案. 总的来说索引的出现其实就是为了提高数据查询的效率 ...

  3. 高性能MySQL笔记-第5章Indexing for High Performance-004怎样用索引才高效

    一.怎样用索引才高效 1.隔离索引列 MySQL generally can’t use indexes on columns unless the columns are isolated in t ...

  4. 高性能MySQL笔记-第5章Indexing for High Performance-005聚集索引

    一.聚集索引介绍 1.什么是聚集索引? InnoDB’s clustered indexes actually store a B-Tree index and the rows together i ...

  5. 高性能MySQL笔记-第5章Indexing for High Performance-003索引的作用

    一. 1. 1). Indexes reduce the amount of data the server has to examine.2). Indexes help the server av ...

  6. 高性能MySQL笔记 第6章 查询性能优化

    6.1 为什么查询速度会慢   查询的生命周期大致可按照顺序来看:从客户端,到服务器,然后在服务器上进行解析,生成执行计划,执行,并返回结果给客户端.其中“执行”可以认为是整个生命周期中最重要的阶段. ...

  7. 读高性能MySql笔记

    1.1 MySQL逻辑架构 MySql服务器逻辑架构图 1.连接管理与安全性 每个客户端连接都会在服务器进程中拥有一个线程,这个连接的查询只会在这个单独的线程中执行,该线程只能轮流在某个CPU核心或者 ...

  8. 高性能MySQL笔记 第4章 Schema与数据类型优化

    4.1 选择优化的数据类型   通用原则   更小的通常更好   前提是要确保没有低估需要存储的值范围:因为它占用更少的磁盘.内存.CPU缓存,并且处理时需要的CPU周期也更少.   简单就好   简 ...

  9. 高性能MySQL笔记:第1章 MySQL架构

    MySQL 最重要.最与众不同的特性是他的存储引擎架构,这种架构的设计将查询处理(Query Precessing)及其系统任务(Server Task)和数据的存储/提取相分离.   1.1 MyS ...

随机推荐

  1. 无法获得锁 /var/lib/dpkg/lock - open

    关于 apt-get update 更新的时候出现 无法获得锁 /var/lib/dpkg/lock - open 解决 直接删除这个锁文件即可: sudo rm /var/lib/dpkg/lock ...

  2. Nikto学习点

    一.使用Nikto扫描https站点 nikto.pl -output myhost.html -g -ssl -Format HTM -host www.test.com -port 443 二.使 ...

  3. 深入C#

     深入C# String类 C#中的String类他是专门处理字符串的(String),他在System的命名空间下,在C#中我们使用的是string 小写的string只是大写的String的一个别 ...

  4. Forward团队-爬虫豆瓣top250项目-最终程序

    托管平台地址:https://github.com/xyhcq/top250 小组名称:Forward团队 小组成员合照: 程序运行方法: 在python中打开程序并运行:或者直接执行程序即可运行 程 ...

  5. $(document).on('click','.classname',function(){}); VS $('.classname').on('click',function(){});

    jquery中用on来绑定事件,经常的写法有$(document).on('click','.classname',function(){});$('.classname').on('click',f ...

  6. enumerate的用法

    names = ["tony","huluwa","tom","jerry","lala"]for ...

  7. Mysql相关存储函数,函数,游标

    https://www.cnblogs.com/zhanglei93/p/6437867.html >>>>请进入

  8. .Net异步实例讲解

    说起异步,Thread,Task,async/await,IAsyncResult 必须掌握 1.线程(Thread) 多线程的意义在于一个应用程序中,有多个执行部分可以同时执行:对于比较耗时的操作( ...

  9. poj 1050 最大子矩阵

    a11   a12   a13   a14   a15 a21   a22   a23   a24   a25 a31   a32   a33   a34   a35 a41   a42   a43  ...

  10. react native (1) 新建页面并跳转

    新建页面 1.新建文件 import React from 'react'; import { Text } from 'react-native'; export default class tod ...