mysql创建索引,mysql索引优化,mysql索引创建删除

================================

©Copyright 蕃薯耀 2020-11-23

http://fanshuyao.iteye.com/

一、mysql创建索引

ALTER TABLE 表名 ADD [UNIQUE | FULLTEXT | SPATIAL] INDEX | KEY [索引名] (字段名1 [(长度)] [ASC | DESC]) [USING 索引方法];

-- 或

CREATE [UNIQUE | FULLTEXT | SPATIAL] INDEX 索引名 ON 表名(字段名) [USING 索引方法];

二、mysql查看索引

show index from 表名;

三、mysql删除索引

DROP INDEX 索引名 ON 表名

-- 或

ALTER TABLE 表名 DROP INDEX 索引名

四、索引优化

1、学生表

CREATE TABLE student(

id INT PRIMARY KEY AUTO_INCREMENT,

stu_no VARCHAR(30) NOT NULL,

`name` VARCHAR(30),

age INT ,

mobile VARCHAR(11),

`status` VARCHAR(1) DEFAULT '1' NOT NULL ,

remark VARCHAR(100)

);

SELECT COUNT(*) FROM student;

SELECT * FROM student;

索引

EXPLAIN SELECT * FROM student l WHERE l.`name`='学生11';

EXPLAIN SELECT * FROM student l WHERE l.`stu_no`='1605782472487';

EXPLAIN SELECT * FROM student l WHERE l.`stu_no`='1605782472487' AND l.`status`='1';

EXPLAIN SELECT * FROM student l WHERE l.`name`='学生1' AND l.`stu_no`='1605782472487';

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name`='学生1';

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name`='学生1' ORDER BY l.`name`;

-- 使用id排序,出现Using filesort

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name`='学生1' ORDER BY l.`id`;

EXPLAIN SELECT * FROM student l WHERE l.`name`='学生1' AND l.`mobile`='13400000001' AND l.`age`='21';

-- 打乱顺序,正常使用索引

EXPLAIN SELECT * FROM student l WHERE l.`age`='21' AND l.`name`='学生1' AND l.`mobile`='13400000001';

-- 没用到索引

-- type:ALL

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name` LIKE '学生1%';

-- 用到索引

-- type:range,注意这里是range,不是index,即非全索引查找,是范围查找

-- Using where; Using index

-- 因为这里查询的字段只有name,name是建了索引的,右边%,索引还是生效,然后直接从索引取数据,而不是检索表,索引比表快

EXPLAIN SELECT l.`name` FROM student l WHERE l.`name` LIKE '学生1%';

-- 没用到索引

-- type:ALL

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name` LIKE '%学生1';

-- 用到索引

-- type:index

-- Using where; Using index

-- 因为这里查询的字段只有name,name是建了索引的,左边%,索引还是生效,然后直接从索引取数据,而不是检索表,索引比表快

EXPLAIN SELECT l.`name` FROM student l WHERE l.`name` LIKE '%学生1';

-- 没用到索引

-- type:ALL

EXPLAIN SELECT l.id,l.`stu_no`,l.`name` FROM student l WHERE l.`name` LIKE '%学生%';

-- 用到索引

-- type:index

-- Using where; Using index

-- 因为这里查询的字段只有name,name是建了索引的,左右两边%,索引还是生效,然后直接从索引取数据,而不是检索表,索引比表快

EXPLAIN SELECT l.`name`,l.`mobile` FROM student l WHERE l.`name` LIKE '%学生%';

-- 创建索引

CREATE UNIQUE INDEX ind_stu_stuNO ON student(stu_no);

CREATE INDEX ind_stu_name_mobile ON student(`name`,mobile);

-- 删除索引

DROP INDEX ind_stu_stuNO ON student;

DROP INDEX ind_stu_name_mobile ON student;

-- 查询表的索引

SHOW INDEX FROM student;

2、课程表

CREATE TABLE course(

id INT PRIMARY KEY AUTO_INCREMENT,

course_no VARCHAR(30) UNIQUE NOT NULL ,

`name` VARCHAR(30),

`status` VARCHAR(1) DEFAULT '1' NOT NULL ,

create_time TIMESTAMP DEFAULT NOW() NOT NULL,-- 只有TIMESTAMP可以设置时间的默认值

remark VARCHAR(100)

);

INSERT INTO course(course_no,`name`) VALUES('1001', '语文');

INSERT INTO course(course_no,`name`) VALUES('1002', '数学');

INSERT INTO course(course_no,`name`) VALUES('1003', '英语');

INSERT INTO course(course_no,`name`) VALUES('1004', '物理');

INSERT INTO course(course_no,`name`) VALUES('1005', '化学');

INSERT INTO course(course_no,`name`) VALUES('1006', '生物');

INSERT INTO course(course_no,`name`) VALUES('1007', '历史');

INSERT INTO course(course_no,`name`) VALUES('1008', '地理');

INSERT INTO course(course_no,`name`) VALUES('1009', '自然科学');

INSERT INTO course(course_no,`name`) VALUES('1010', '体育');

INSERT INTO course(course_no,`name`) VALUES('1011', '哲学');

INSERT INTO course(course_no,`name`) VALUES('1012', '考古');

INSERT INTO course(course_no,`name`) VALUES('1013', '高等数学');

INSERT INTO course(course_no,`name`) VALUES('1014', '大学英语');

INSERT INTO course(course_no,`name`) VALUES('1015', '艺术');

SELECT * FROM course;

-- 查询表的索引

SHOW INDEX FROM course;

3、学生课程关系表

CREATE TABLE stu_course(

id INT PRIMARY KEY AUTO_INCREMENT,

stu_id INT NOT NULL ,

course_id INT NOT NULL ,

create_time TIMESTAMP DEFAULT NOW() NOT NULL-- 只有TIMESTAMP可以设置时间的默认值

);

SELECT * FROM stu_course;

SELECT COUNT(1) FROM stu_course;

加索引前后对比

-- s ref 1

-- sc ALL 150646

-- c eq_ref 1

EXPLAIN

SELECT s.*,c.`name` FROM student s

LEFT JOIN stu_course sc ON sc.`stu_id`=s.`id`

LEFT JOIN course c ON c.`id`=sc.`course_id`

WHERE s.`name`='学生1'

;

-- 创建索引

ALTER TABLE stu_course ADD INDEX stu_course_stuId(stu_id);

-- 创建索引后

-- s ref 1

-- sc ref 753

-- c eq_ref 1

EXPLAIN

SELECT s.*,c.`name` FROM student s

LEFT JOIN stu_course sc ON sc.`stu_id`=s.`id`

LEFT JOIN course c ON c.`id`=sc.`course_id`

WHERE s.`name`='学生1'

;

小表驱动大表

-- 加索引

ALTER TABLE stu_course ADD INDEX stu_course_courseId(course_id);

-- 小表驱动大表

-- c ALL 15

-- sc ref 753

EXPLAIN

SELECT c.*,sc.`stu_id` FROM course c

LEFT JOIN stu_course sc ON sc.`course_id`=c.`id`

;

-- 大表驱动小表

-- sc ALL 150646

-- c eq_ref 1

EXPLAIN

SELECT c.*,sc.`stu_id` FROM course c

RIGHT JOIN stu_course sc ON sc.`course_id`=c.`id`

;

-- 总结:尽量使用小表驱动大表

in和EXISTS

-- in和EXISTS

-- EXISTS查询语法

SELECT select_list FROM a_table WHERE [NOT] EXISTS(subquery);

-- in查询

-- 1 sc ALL 150646

-- 2 c unique_subquery 1

EXPLAIN

SELECT * FROM stu_course sc WHERE sc.`course_id` IN (SELECT id FROM course c);

-- sc ALL 150646

-- c unique_subquery 1

EXPLAIN

SELECT * FROM stu_course sc WHERE sc.`course_id` IN (SELECT id FROM course c WHERE c.`name` ='数学');

-- EXISTS查询

-- 1 sc ALL 150646Using where

-- 2 c eq_ref 1 Using index

EXPLAIN

SELECT * FROM stu_course sc WHERE EXISTS (SELECT 1 FROM course c WHERE c.`id`=sc.`course_id`);

-- sc ALL 150646Using where

-- c eq_ref 1Using where

EXPLAIN

SELECT * FROM stu_course sc WHERE EXISTS (SELECT 1 FROM course c WHERE c.`name` ='数学' AND c.`id`=sc.`course_id`);

-- in和EXISTS总结:

-- EXISTS:可以理解为:将外查询(左边)表的每一行,代入内查询(右边)作为检验,如果内查询返回的结果取非空值,则EXISTS子句返回TRUE,这一行行可作为外查询的结果行,否则不能作为结果。

-- 1、通常情况下采用exists要比in效率高,因为IN不走索引。

-- 2、左边为小表时(in是大表),用in性能好。左边为大表时(EXISTS是小表),用EXISTS性能好。

4、字典表

-- 字典表

-- drop table dict;

CREATE TABLE dict(

id INT PRIMARY KEY AUTO_INCREMENT,

`type` VARCHAR(30) NOT NULL,

`name` VARCHAR(30),

`value` VARCHAR(50),

create_time TIMESTAMP DEFAULT NOW() NOT NULL-- 只有TIMESTAMP可以设置时间的默认值

);

INSERT INTO dict(`type`,`name`,`value`) VALUES('status','有效', '1');

INSERT INTO dict(`type`,`name`,`value`) VALUES('status','无效', '0');

SELECT * FROM dict;

================================

©Copyright 蕃薯耀 2020-11-23

http://fanshuyao.iteye.com/

mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除相关推荐

  1. mysql创建唯一性降序索引_MySQL 8 新特性之降序索引底层实现

    什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...

  2. mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...

    这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...

  3. mysql数据库教程级联_Mysql实现级联操作(级联更新、级联删除)

    tablestu( sidint UNSIGNED primary keyauto_increment, namevarchar(20) not null) TYPE=InnoDB charset=u ...

  4. mysql 物理备份工具_mysql物理备份工具Xtrabackup安装配置

    mysql物理备份工具Xtrabackup安装配置 1Xtrabackup工具介绍 Xtrabackup是一个对InnoDB做物理数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具 ...

  5. mysql schema数据混乱_MySQL之Schema与数据类型优化

    选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...

  6. mysql group by 天_MySQL group by语句如何优化

    在MySQL中,新建立一张表,该表有三个字段,分别是id,a,b,插入1000条每个字段都相等的记录,如下: mysql> show create table t1G ************* ...

  7. sql语句分析是否走索引_mysql sql语句执行时是否使用索引检查方法

    在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...

  8. 覆盖索引与联合索引_MySQL:你知道什么是覆盖索引吗?

    什么叫做覆盖索引? 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取 ...

  9. mysql 存储过程加密工具_MySQL存储过程调试工具-dbForge Studio for MySQL

    对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for ...

  10. mysql 命令行访问_Mysql 命令行模式访问操作mysql数据库操作

    使用环境 在cmd模式下输入 mysql --version (查看mysql安装的版本). 完整的命令可以通过mysql --help来获取. 本测试使用的Mysql版本是mysql5, 本测试使用 ...

最新文章

  1. html创建等边三角形,CSS3 等边三角形组成星形图案
  2. 使用定制的NSDictionary的方法,对NSArray进行排序(附:数组排序两种常见方法)
  3. 金山毒霸2012正式公测 首次实现新病毒99秒查杀
  4. WPF中的Pack URI
  5. 网络经济与企业管理(第 2 章:企业战略管理)
  6. html css 表头,css固定表格表头(各浏览器通用)
  7. postgresql编译安装及配置
  8. oracle数据库修改连接数
  9. IDEA多款主题颜色推荐!炫酷经典!
  10. 4、STYLE-------------labview宝典
  11. 网安信—web3.0是什么?
  12. 深度学习(图像方向)常见名词术语
  13. 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
  14. 基于JavaGUI的中英文打字训练测试软件设计
  15. CF513C Maximum Subrectangle
  16. 敏捷项目的史诗与迭代
  17. 5s进水不开机怎么办 苹果5s进水后无法开机的维修方法
  18. scp 远程拷贝文件
  19. imgbb图床API
  20. 在行 app android,在行app安卓版

热门文章

  1. termux—手机远程连接服务器教程
  2. final cut pro 最快速,最简单的批量字幕制作方法!
  3. 电脑录音软件大全,推荐一波优秀的录音软件!
  4. linux查看服务器网络延迟,ECS Linux下的qperf测量网络带宽和延迟的具体步骤
  5. calcite parser
  6. 视频号还是直播?2021年微信财富密码预言
  7. 用python的嵌套if结构开发一个输入(input)计税计算器
  8. 初识OpenGL (-)纹理过滤(Texture Filtering)
  9. 完全用Linux:半年来,Linux高效完成我所有的工作!(转贴)
  10. 图片型-半图形封面设计