建表SQL

CREATE TABLE staffs (

id INT PRIMARY KEY AUTO_INCREMENT,

NAME VARCHAR (24) NULL DEFAULT '' COMMENT '姓名',

age INT NOT NULL DEFAULT 0 COMMENT '年龄',

pos VARCHAR (20) NOT NULL DEFAULT '' COMMENT '职位',

add_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '入职时间'

) CHARSET utf8 COMMENT '员工记录表' ;

INSERT INTO staffs(NAME,age,pos,add_time) VALUES('z3',22,'manager',NOW());

INSERT INTO staffs(NAME,age,pos,add_time) VALUES('July',23,'dev',NOW());

INSERT INTO staffs(NAME,age,pos,add_time) VALUES('2000',23,'dev',NOW());

INSERT INTO staffs(NAME,age,pos,add_time) VALUES(null,23,'dev',NOW());

SELECT * FROM staffs;

ALTER TABLE staffs ADD INDEX idx_staffs_nameAgePos(name, age, pos);

案例(索引失效)

1、全值匹配我最爱

索引 idx_staffs_nameAgePos 建立索引时 以 name , age ,pos 的顺序建立的。全值匹配表示 按顺序匹配的

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July';

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25;

EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND age = 25 AND pos = 'dev';

说明:如果查询过程中,若没有查询第一个NAME字段,索引将无效

有NAME,无age,部分索引失效

第一个索引字段相当于火车头,后面的索引字段相当于车厢,如果只剩下车头,火车依然可以开动,若没有车头,火车将无法运行。可以以此进行类比。

2、最佳左前缀法则

如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始并且不跳过索引中的列。

and 忽略左右关系。既即使没有没有按顺序 由于优化器的存在,会自动优化。

经过试验结论 建立了 idx_nameAge 索引 id 为主键

1.当使用覆盖索引的方式时,(select name/age/id from staffs where age=10 (后面没有其他没有索引的字段条件)),即使不是以 name 开头,也会使用 idx_nameAge 索引。

既 select 后的字段 有索引,where 后的字段也有索引,则无关执行顺序。

2.除开上述条件 才满足最左前缀法则。

EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos = 'dev';

EXPLAIN SELECT * FROM staffs WHERE pos = 'dev';

口诀:带头大哥不能死,中间兄弟不能断。百分like加右边

3、不要在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描

EXPLAIN SELECT * FROM staffs WHERE left(NAME,4) = 'July';

4、存储引擎不能使用索引中范围条件右边的列

范围 若有索引则能使用到索引,范围条件右边的索引会失效(范围条件右边与范围条件使用的同一个组合索引,右边的才会失效。若是不同索引则不会失效)

5、尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *

6、mysql 在使用不等于(!= 或者<>)的时候无法使用索引会导致全表扫描

索引 idx_nameAgeJob

idx_name

使用 != 和<> 的字段索引失效( != 针对数值类型。 <>针对字符类型

前提 where and 后的字段在混合索引中的位置比比当前字段靠后 where age != 10 and name='xxx' ,这种情况下,mysql自动优化,将 name='xxx' 放在 age !=10 之前,name 依然能使用索引。只是 age 的索引失效)

7、is not null 也无法使用索引,但是is null是可以使用索引的

8、like以通配符开头('%abc...')mysql索引失效会变成全表扫描的操作

like ‘%abc%’ type 类型会变成 all

like ‘abc%’ type 类型为 range ,算是范围,可以使用索引

问题:解决like '%字符串%'时索引不被使用的方法??

建表,插入数据

CREATE TABLE `tbl_user` (

`id` INT(11) NOT NULL AUTO_INCREMENT,

`NAME` VARCHAR(20) DEFAULT NULL,

`age` INT(11) DEFAULT NULL,

email VARCHAR(20) DEFAULT NULL,

PRIMARY KEY (`id`)

) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

#drop table tbl_user

INSERT INTO tbl_user(NAME,age,email) VALUES('1aa1',21,'b@163.com');

INSERT INTO tbl_user(NAME,age,email) VALUES('2aa2',222,'a@163.com');

INSERT INTO tbl_user(NAME,age,email) VALUES('3aa3',265,'c@163.com');

INSERT INTO tbl_user(NAME,age,email) VALUES('4aa4',21,'d@163.com');

INSERT INTO tbl_user(NAME,age,email) VALUES('aa',121,'e@163.com');

建索引之前进行测试

#before index

EXPLAIN SELECT NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT id FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT NAME FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT age FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT id,NAME FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT id,NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT NAME,age FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT * FROM tbl_user WHERE NAME LIKE '%aa%';

EXPLAIN SELECT id,NAME,age,email FROM tbl_user WHERE NAME LIKE '%aa%';

需求分析:查询时字段两边都是%,且索引不能失效

创建索引(覆盖索引)

#create index

CREATE INDEX idx_user_nameAge ON tbl_user(NAME,age);

#DROP INDEX idx_user_nameAge ON tbl_user

分析:email字段并没有创建索引,覆盖索引失效

覆盖索引:建立的索引字段和查询的字段在个数、顺序上最好完全一致。

9、字符串不加单引号索引失效

底层进行转换使索引失效,使用了函数造成索引失效

10、少用or,用它来连接时会索引失效

【总结】

带头大哥不能死

中间兄弟不能断(永远要符合最佳左前缀原则)

索引列上无计算

like百分加右边

范围之后全失效

字符串里有引号

mysql索引优化分析_MySQL索引优化与分析(重要)相关推荐

  1. mysql索引分析_MySQL索引分析和优化

    什么是索引? 索引用来快速地寻找那些具有特定值的记录,所有MySQL索引都以B-树的形式保存.如果没有索引,执行查询时MySQL必须从第一个记录开始扫描整个表的所有记录,直至找到符合要求的记录.表里面 ...

  2. mysql 查找相似数据_MySQL性能优化做得好的人,都懂的索引绝技

    一步一步推导出 MySQL索引的底层数据结构. MySQL作为互联网中非常热门的数据库,其底层的存储引擎和数据检索引擎的设计非常重要,尤其是 MySQL数据的存储形式以及索引的设计,决定了 MySQL ...

  3. mysql索引条件下推_MySQL 索引条件下推优化

    一 什么是"索引条件下推" "索引条件下推",称为Index Condition Pushdown (ICP),这是MySQL提供的用某一个索引对一个特定的表从 ...

  4. mysql date建索引有用吗_Mysql索引分析:适合建索引?不适合建索引?【转】

    数据库建立索引常用的规则如下: 1.表的主键.外键必须有索引: 2.数据量超过300的表应该有索引: 3.经常与其他表进行连接的表,在连接字段上应该建立索引: 4.经常出现在Where子句中的字段,特 ...

  5. mysql 索引类型案例_Mysql索引类型与基本用法实例分析

    本文实例讲述了Mysql索引类型与基本用法.分享给大家供大家参考,具体如下: 索引 MySQL目前主要有以下几种索引类型: 普通索引 唯一索引 主键索引 组合索引 全文索引 - 普通索引 是最基本的索 ...

  6. mysql数据库优化命令_MySQL数据库优化总结

    一个:MySQL标准数据库优化注意事项 1.数据库设计(表设计合理)三范式(规范的模式) 三范式包含: 第一范式:1NF是对属性的原子性的约束.要求属性具有原子性,不可再分解.(仅仅要是关系型数据库都 ...

  7. mysql索引详解_MySQL索引详解

    导读:大家都知道,一个MySQL数据库能够储存大量的数据,如果要查找那一个数据,就得费好大劲从一大堆的数据中找到,即费时间又费力气,这时,索引的出现就大大减轻了数据库管理员的工作.本文介绍了数据库索引 ...

  8. mysql数据库优化大全_MySQL数据库优化技巧大全

    简介: MySQL数据库优化技巧大全 MySQL优化三大方向 ① 优化MySQL所在服务器内核(此优化一般由运维人员完成). ② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进 ...

  9. mysql+date+范围+性能_MySQL性能优化的最佳20+条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据 ...

最新文章

  1. Android开发遇到eclipse运行程序时报timeout
  2. 3个点让你彻底明白,为什么要使用MQ消息中间件?
  3. 基于物联网的新型智能家居控制系统设计
  4. topcoder srm 708 div1 -3
  5. 【MySQL快速入门】高级查询:计算函数分组计算
  6. hive -e执行命令报错
  7. 分享一个强大的弹出框
  8. LINUX下C语言用access()检查文件可读、可写权限
  9. java毕业设计蔚蓝在线学习平台源码+lw文档+mybatis+系统+mysql数据库+调试
  10. Python数学建模入门【1】
  11. linux英英词典项目,[开发手记] 一款基于命令行的英英词典 (A CLI-Based EE Dictionary)...
  12. 还记得2048怎么玩吗?快来玩会儿(摸鱼)吧
  13. Android应用测试篇
  14. 红孩儿编辑器的模块设计3
  15. 乱得那么认真|阿里小二办公桌上的秘密~内部流出
  16. OpenFOAM 学习笔记
  17. 一些程序员的找工作常见的面试问题
  18. Spring核心机制IoC与AoP梳理
  19. js jquery新窗口打开的几种方式
  20. VSC学习前端,不容错过的插件

热门文章

  1. 190403内置模块
  2. 雍正王朝里康熙临终予四爷言
  3. 2019全国大学生信息安全竞赛—Web
  4. 计算机应用说课稿,中职计算机说课稿
  5. WIN10 以管理员权限设置开机启动的问题
  6. java去除符号和字母_java 字符串中去除 数字 字母 符号N*1*senten.Length=M*M
  7. 移动APP测试用例设计实践经验(转载)
  8. Kvm与webvirtmgr虚拟化安装
  9. esp8266保存html文件,八,ESP8266 文件保存数据
  10. 百度智能云携手鄂尔多斯市:大数据赋能,让房子有了身份证会说话