一.建立索引的原则(规范)

1.选择唯一性索引

只要可以创建唯一性索引的,一律创建唯一索引(因为速度快呀)

判断是否能创建唯一索引,用count(列名),count(distinct(列名))一样就能创建

2.如果该列重复值较多,则采用联合索引

3.为经常需要排序,分组,联合操作的字段建立索引,例如京东,淘宝那些产品就需要建立索引

4.为常作为查询字段的建立索引,比如你搜索的商品,它们基本就是做了索引的,而且不仅做了,还肯定加了缓存

5.如果是经常查询字段,重复值还特别多的,使用联合索引

6.字段值很长的,尽量使用前缀索引

7.限制索引的数目,索引不是每一列都要创建的,每个索引都要占用磁盘空间,创的越多,磁盘占用越大,修改表的时候,对索引的重构和更新非常麻烦还很慢,每次update都很麻烦,而且还浪费磁盘I/O

8.删除不常用的索引和不再使用的索引,减少索引对更新操作的影响,节省资源

二.优化sql语句

1.没有查询条件,或者查询条件没有建立索引(没查询条件就是全表扫描)

优化:添加查询条件,为查询条件创建索引

(在业务数据中,是没有全表扫描这种需求的,而且用户也不可能有权限去全表扫描,对用户体验是痛苦的,对服务器性能更是毁灭性打击,如果有人提出这种要求,拉出去祭天就是了!!!)

2.查询结果集原表中的大部分数据时(大概在25%以上时就将不走索引),添加limit限定

3.索引本身失效,数据不真实,对于表的内容更新过于频繁,有可能导致索引失效

怎么看是否失效呢,写个一定会走索引的语句的脚本,然后监控它

如果得到结果是失效的,删除索引,重新建立

4.查询条件使用函数在索引列上进行运算例如加减乘除,则不走索引(错误示范),如果你硬要秀操作则看(正确示范)

错误示范
select * from student where id-=; 正确示范
select * from student where id=+; 或者 select * from student where id=;

5.隐式转化导致的索引失效(一般都是开发犯的错误,祭天祭天!!!)

mysql> create table test (id int ,name varchar(),telnum varchar());
mysql> insert into test values(,'zs',''),(,'l4',),(,'w5',),(,'z4',);
mysql> explain select * from test where telnum=;
mysql> alter table test add index idx_tel(telnum);
mysql> explain select * from test where telnum=;
mysql> explain select * from test where telnum=;
mysql> explain select * from test where telnum='';

6. <> ,not in 不走索引(单独的>,<,in 有可能走,也有可能不走,和结果集有关,尽量结合业务添加limitor或in尽量改成union)

mysql> select * from tab where telnum <> '';
mysql> explain select * from tab where telnum <> '';

7.like "%_" 百分号在最前面不走索引

#走range索引扫描
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '31%';
#不走索引
EXPLAIN SELECT * FROM teltab WHERE telnum LIKE '%110';

8.单独引用联合索引里非第一位置的索引列

CREATE TABLE t1 (id INT,NAME VARCHAR(),age INT ,sex ENUM('m','f'),money INT);
ALTER TABLE t1 ADD INDEX t1_idx(money,age,sex);
DESC t1
SHOW INDEX FROM t1
#走索引的情况测试
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND age= AND sex='m';
#部分走索引
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND age=;
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE money= AND sex='m';
#不走索引
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age=
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE age= AND sex='m';
EXPLAIN SELECT NAME,age,sex,money FROM t1 WHERE sex='m';

MySQL学习【第八篇索引优化】的更多相关文章

  1. 数据库MySQL学习笔记高级篇

    数据库MySQL学习笔记高级篇 写在前面 学习链接:数据库 MySQL 视频教程全集 1. mysql的架构介绍 mysql简介 概述 高级Mysql 完整的mysql优化需要很深的功底,大公司甚至有 ...

  2. MySql数据表设计,索引优化,SQL优化,其他数据库

    MySql数据表设计,索引优化,SQL优化,其他数据库 1.数据表设计 1.1数据类型 1.2避免空值 1.3text类型优化 2.索引优化 2.1索引分类 2.2索引优化 3.SQL优化 3.1分批 ...

  3. MySQL学习(二)索引原理及其背后的数据结构

    首先区分几个概念: 聚集索引 主索引和辅助索引(即二级索引) innodb中每个表都有一个聚簇索引(clustered index ),除此之外的表上的每个非聚簇索引都是二级索引,又叫辅助索引(sec ...

  4. MySQL学习笔记十五:优化(2)

    一.数据库性能评测关键指标 1.IOPS:每秒处理的IO请求次数,这跟磁盘硬件相关,DBA不能左右,但推荐使用SSD. 2.QPS:每秒查询次数,可以使用show status或mysqladmin ...

  5. MySQL学习笔记十四:优化(1)

    SQL优化 1.查看各种SQL执行的频率 mysql> show status like 'Com_select';--Com_insert,Com_delete,connections(试图连 ...

  6. MySQL学习(二)索引与锁 --- 2019年1月

    1.Order By 是怎么工作的 MySQL做排序是一个成本比较高的操作.MySQL会为每个线程分配一个 sort_buffer 内存用于排序,该内存大小为 sort_buffer_size. 全字 ...

  7. MySQL数据库高级二:索引优化

    索引优化非常的重要 1.预热 java开发 DBA培训很少,需要经验磨练 索引优化的效果非常好 左外连接 MySQL没有全连接 7种join一定要会写 具体见武林的例子 union的字段顺序要相同 6 ...

  8. MySQL学习(七) 索引选择(半原创)

    概述 该篇文章主要阐述一个例子(例子来自参考资料,侵删),然后总结今天相关的知识点. 例子 (例子来自参考文章,非原创) 创建表并插入数据,并执行查询 CREATE TABLE `t` ( `id` ...

  9. Mysql学习笔记(九)索引查询优化

    PS:上网再次看了一下数据库关于索引的一些细节...感觉自己学的东西有点少...又再次的啃了啃索引.... 学习内容: 索引查询优化... 上一章说道的索引还不是特别的详细,再补充一些具体的细节... ...

随机推荐

  1. (C#) 多线程访问探讨,如果保证线程安全?

    先抛出几点疑问: 1. 多个线程同时访问同一个“值类型变量“(value type, stored in stack), 如果保证安全访问? 2. 多个线程同时访问同一个“引用类型变量“(refere ...

  2. 用SumatraPdf实现PDF静默打印

    原文:https://yutuo.net/archives/24a22d50d6001564.html 之前做一系统,有一个打印PDF文件的需求,需求如下: 能指定打印机 能两面打印 最好能静默打印 ...

  3. 一、angularjs基础了解

    说明:此处比较杂,目前没有统一的总结哦 angularjs 是mvvm框架 加载JS文件总是使用后缀为.min.js的文件,因为这些文件是经过压缩的,能提升应用的启动速度 模块说明: 1.config ...

  4. Appium元素定位(uiautomatorviewer)

    一.uiautomatorviewer元素定位 1.adroid-sdk的安装目录tools下有1个自带的工具uiautomatorviewer,打开后,如下所示: 点击后,如图所示: 步骤: a.链 ...

  5. Java笔记-添加自定义公共类库

    大型项目,为了方便团队开发,需要建立公共类库,提高类库的重用性和维护性步骤如下: --如果朋友您想转载本文章请注明转载地址"http://www.cnblogs.com/XHJT/p/387 ...

  6. CentOS随笔 - 6.CentOS7安装Git服务器

    前言 转帖请注明出处: http://www.cnblogs.com/Troy-Lv5/ 版本管理当然是选择git..反正我是被svn坑怕了... 这次安装的是git 2.18.0 点击下载 准备安装 ...

  7. JavaScript的本地对象、内置对象、宿主对象

    首先解释下宿主环境:一般宿主环境由外壳程序创建与维护,只要能提供js引擎执行的环境都可称之为外壳程序.如:web浏览器,一些桌面应用系统等.即由web浏览器或是这些桌面应用系统早就的环境即宿主环境. ...

  8. CentOS 7 安装Rabbitmq

    第一步也是往往最重要的一步:下载安装包! Rabbitmq地址:https://github.com/rabbitmq/rabbitmq-server/releases/tag/v3.7.5 Erla ...

  9. 设计模式之Proxy(代理)

    设计模式之Proxy(代理) 板桥里人banq http://www.jdon.com 2002/04/21/ 理解并使用设计模式,能够培养我们良好的面向对象编程习惯,同时在实际应用中,可以如鱼得水, ...

  10. opencv python3.6安装和测试

    安装: 命令行  pip install D:\python3.6.1\Scriptsopencv_python-3.2.0-cp36-cp36m-win_amd64.whl 测试代码: import ...