学习索引优化之前安装演示数据库以供练习

使用mysql提供的sakila数据库

文件下载: http://downloads.mysql.com/docs/sakila-db.tar.gz
解压后导入数据库
shell> mysql -uroot -p < salila-schema.sql
shell> mysql -uroot -p < salika-data.sql

索引优化策略
1.索引列上不能使用表达式或函数

2.前缀索引和索引列的选择性
前缀索引:a.字段长度小; b.索引选择性好

如果选择前2个字符(索引长度是2个字符)作为前缀索引,那么索引选择性为2/4=0.5, 索引选择性不好;
如何选择前3个字符(索引长度是3个字符)作为前缀索引,那么索引选择性为4/4=0.5, 索引选择性好;

备注:对于BLOB,TEXT,或者很长的VARCHAR类型的列,必须使用前缀索引,因为MySQL不允许索引这些列的完整长度

3.联合索引:如何选择索引列的顺序
- 经常会被使用到的列优先
- 选择性高的列优先
- 宽度小的列优先

4.覆盖索引
如果一个索引包含(或覆盖)所有需要查询的字段的值,称为‘覆盖索引’。即只需扫描索引而无须回表
优点:

  • 可以优化缓存,减少磁盘IO操作
  • 可以减少随机IO,变随机IO操作变为顺序IO操作
  • 可以避免对Innodb主键索引的二次查询
  • 可以避免MyIsam表进行系统调用

无法使用覆盖索引的情况

  • 存储引擎不支持覆盖索引
  • 查询中使用了太多的列
  • 使用了双%号的like查询

使用索引来有优化查询

1.使用索引扫描来优化排序

  • 索引的列顺序和Order By子句的顺序完全一致

    联合索引rental_date,列顺序依次为rental_date, inventory_id, customer_id
explain select * from rental where rental_date='2005-05-09' order by  inventory_id, customer_id;


而如果列顺序不一致呢?下面这个query结果出现了filesort

explain select * from rental where rental_date='2005-05-09' order by  customer_id, inventory_id;

  • 索引中所有列的方向(升序,降序)和Order by子句完全一致

inventory_id desc 方向不一致,导致filesort的出现

explain select * from rental where rental_date='2005-05-09' order by  inventory_id desc, customer_id;

  • Order by中的字段全部在关联表中的第一张表中

2.模拟Hash索引优化查询:以film表说明

mysql> show columns from film;

对title进行查找,一般需要建立前缀索引,但是这个介绍一种模拟hash索引查询

步骤

mysql> alter table film add title_md5 varchar(32);
mysql> update film set title_md5=md5(title);
mysql> create index idx_md5 on film(title_md5);
mysql> explain select * from film where title_md5=md5('EGG IGBY') and title = 'EGG IGBY';

使用Hash索引优化查询的注意点:

  • 只能处理键值的全值匹配查找
  • 所使用的Hash函数决定着索引键的大小

3.利用索引优化锁

  • 索引可以减少锁定的行数
  • 索引可以加快处理速度,同时也加快了锁的释放

索引的维护和优化

1.删除重复和冗余的索引

  • 重复索引

  • 冗余索引

重复的索引是完全不必要的,但是冗余的索引,有的时候有意建立的

如果判断索引是重复还是冗余,使用工具pt-duplicate-key-checker
关于该工具的使用见pt-duplicate-key-checker检查数据库的重复索引

2.查询未被使用的索引:通过sql语句来查询

3.更新索引统计信息及减少索引碎片

analyze table table_name
# 维护表的碎片
optimize table table_name #使用不当会导致锁表

MySQL数据库优化之索引优化相关推荐

  1. 【学习笔记】MySQL数据库高级版 - 索引优化、慢查询、锁机制等

    本文是尚硅谷周阳(阳哥)老师的MySQL高级篇视频的学习笔记.由于视频比较老,所以在高版本的MySQL中索引的地方做了优化,和视频的内容不完全一样,不过大体一致.从第四节锁机制开始的部分还没有整理. ...

  2. psql where里有自定义函数慢_阿里P8架构师谈:MySQL慢查询优化、索引优化、以及表等优化总结...

    MySQL优化概述 MySQL数据库常见的两个瓶颈是:CPU和I/O的瓶颈. CPU在饱和的时候一般发生在数据装入内存或从磁盘上读取数据时候. 磁盘I/O瓶颈发生在装入数据远大于内存容量的时候,如果应 ...

  3. 再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化

    原文:再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化 继上篇文章<绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来>发布后在博客园首页展示 ...

  4. mysql与数据处理,[转载]Mysql数据库千万级数据处理优化

    转载:http://blog.sina.com.cn/s/blog_6dcd17320100tm6o.html 1. 对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by ...

  5. mysql模糊查询之索引优化

    mysql模糊查询之索引优化 三表连查之模糊查询索引优化 注:具体用法10和11步骤. 1.t_project表 DROP TABLE IF EXISTS `t_project`; CREATE TA ...

  6. MySQL数据库:SQL语句优化

    数据库最常用的优化方式有:SQL语句和索引.数据库表结构.系统配置.硬件. 优化效果:SQL语句和索引 < 数据库表结构 < 系统配置 < 硬件,成本也是递增的. 优化方法 设计符合 ...

  7. sql查询索引语句_sql优化总结--基于sql语句优化和索引优化

    概述 最近做查询,统计和汇总.由于数据量比较庞大,大部分表数据上百万,甚至有的表数据上千万.所以在系统中做sql优化比较多,特此写一篇文章总结一下关于sql优化方面的经验. 导致查询缓慢的原因 1.数 ...

  8. MySQL数据库:SQL优化与索引优化

    一.索引优化: 1.like语句的前导模糊查询不使用索引: select * from doc where title like '%XX':   --不能使用索引 select * from doc ...

  9. 1000并发 MySQL数据库_再送一波干货,测试2000线程并发下同时查询1000万条数据库表及索引优化...

    继上篇文章<绝对干货,教你4分钟插入1000万条数据到mysql数据库表,快快进来>发布后在博客园首页展示得到了挺多的阅读量,我这篇文章就是对上篇文章的千万级数据库表在高并发访问下如何进行 ...

  10. Python全栈(三)数据库优化之10.MySQL高级-表优化和索引优化

    文章目录 一.单表优化 二.双表优化 三.三表优化 四.索引优化 1.建表: 2.插入数据: 3.建立复合索引: 4.口诀: 全值匹配我最爱: 最左前缀要遵守: 带头大哥不能死: 中间兄弟不能断: 索 ...

最新文章

  1. 二逼平衡树——树套树(线段树套Splay平衡树)
  2. 猎头出500万年薪挖百度某高T,却被对方拒绝!网友:钱不是最重要的!
  3. Python 使用sys.exc_info自己捕获异常详细信息
  4. python 3.6.5 shell_Linux 安装 Python3.6.5
  5. Android中ProgressDialog的应用
  6. 矩池云利用ipykernel为JupyterLab添加kernel以及展示出来
  7. nginx 1.8.0下载
  8. restfulframework详解
  9. Java、JSP毕业设计管理系统
  10. android炫酷的效果
  11. windows10安装虚拟机virtualbox详细步骤
  12. 微信小程序开发-模仿“优优老师”课程日历
  13. 时态的重建--适合理工直男的钟平老师逻辑英语学习笔记
  14. dsp版win10和普通版区别_Windows10各个版本有什么不同,如何选择适合自己的Win10系统...
  15. AI 新技术革命将如何重塑就业和全球化格局?深度解读 UN 报告(上篇)
  16. 【安卓学习积累】IntentService的源码分析
  17. 聊聊P6赢得值理论的运用
  18. 奇安信渗透测试工程师试题(2020)
  19. php与go按位异或的差异
  20. linux 远程解压tar.gz,linux解压tar.gz

热门文章

  1. 小金鱼呀 python-django-初识Form组件(Form类)
  2. 蒜头君的生日(日期格式)
  3. 敏感词的字典树匹配(lua版)
  4. Windows手动添加开机启动项
  5. 用Javascript读取CheckBox数组的值
  6. 让网站支持RSS订阅
  7. stata面板数据单位根检验llc_干货分享 | 面板数据单位根检验软件操作和解读
  8. python爬虫网络出错怎么办_python网络爬虫(3)python爬虫遇到的各种问题(python版本、进程等)...
  9. OpenCV2:Mat属性type,depth,step
  10. 浅谈Redisson底层源码