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

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. Angular1.x 之Providers (Value, Factory, Service and Constant )

    官方文档Providers Each web application you build is composed of objects that collaborate to get stuff do ...

  2. CentOS6.5 SSH无法连接

    1.确认连接交机机端口的正常,如查更换多几个端口试 2.确认网络不存在问题. 3.把selinux iptables服务全部关闭 4.查看本机是否侦听22端口和是否开启ssh服务 命令:netstat ...

  3. PMP项目管理

    http://blog.sina.com.cn/s/blog_a3922d430102wv38.html https://www.zhihu.com/question/19882243 最近学习pmp ...

  4. CSS标准文档流 块级元素和行内元素

    标准文档流 什么是标准文档流 宏观的将,我们的web页面和ps等设计软件有本质的区别,web 网页的制作,是个“流”,从上而下 ,像 “织毛衣”.而设计软件 ,想往哪里画东西,就去哪里画 空白折叠现象 ...

  5. July 28th 2017 Week 30th Friday

    If equal affection cannot be, let the more loving be me. 如果没有相等的爱,那就让我爱多一点吧. There is seldom equal a ...

  6. Manjaro 更新vim插件或者系统后 YCM失效

    manjaro 更新之后,ycm总会多少有些毛病: 第一次遇到的问题: PluginUpdate之后ycm失效.使用命令:YcmToggleLogs查看ycmd_39047_stderr_Pp1GpB ...

  7. JSON与对象的序列化与反序列化

    一.利用JavaScriptSerializer 类 System.Web.Script.Serialization空间,位于System.Web.extensions.dll中. JavaScrip ...

  8. 【Win10+eclipse+MinGW+QT安装教程】已有eclipse环境下配置QT插件出错详解

    (纪念一下装了一整天濒临绝望的自己[/doge]) (以下所有下载项一律使用32位) step1:下载安装eclipse.适配的jdk.MinGW和QT 1.下载32位eclipse for c++以 ...

  9. c++计算器后续(4)

    自娱自乐: 大概是终于做到没做完的部分了,第三步助教学长的评论还没去改,感觉那个把读取文件放到Scan里面比较麻烦,其他大概还好.以上. 文件读写: 先是原来的残留问题,都是和fstream :: o ...

  10. 使用Hash直接登录Windows(HASH传递)

    抓取windows hash值 得到administrator的hash: 598DDCE2660D3193AAD3B435B51404EE:2D20D252A479F485CDF5E171D9398 ...