mysql物理删除索引_mysql创建索引,mysql索引优化,mysql索引创建删除
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索引创建删除相关推荐
- mysql创建唯一性降序索引_MySQL 8 新特性之降序索引底层实现
什么是降序索引 大家可能对索引比较熟悉,而对降序索引比较陌生,事实上降序索引是索引的子集. 我们通常使用下面的语句来创建一个索引: create index idx_t1_bcd on t1(b,c, ...
- mysql 回表查询优化_MySQL中的回表查询与索引覆盖:一次百万级别分页查询使用Limit 从90秒到0.6毫秒的优化...
这里写目录标题 事故现场 解决方案 提到的"回表查询" InnoDB的索引 什么是回表查询 怎么优化回表查询 事故现场 数据库使用的MySQL,有一个日志表,需要进行分页查询,于是 ...
- mysql数据库教程级联_Mysql实现级联操作(级联更新、级联删除)
tablestu( sidint UNSIGNED primary keyauto_increment, namevarchar(20) not null) TYPE=InnoDB charset=u ...
- mysql 物理备份工具_mysql物理备份工具Xtrabackup安装配置
mysql物理备份工具Xtrabackup安装配置 1Xtrabackup工具介绍 Xtrabackup是一个对InnoDB做物理数据备份的工具,支持在线热备份(备份时不影响数据读写),是商业备份工具 ...
- mysql schema数据混乱_MySQL之Schema与数据类型优化
选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要.不管存储哪种类型的数据,下面几个简单的原则都有助于做出更好的选择: 更小的通常更好 一般情况下,应该尽量使 ...
- mysql group by 天_MySQL group by语句如何优化
在MySQL中,新建立一张表,该表有三个字段,分别是id,a,b,插入1000条每个字段都相等的记录,如下: mysql> show create table t1G ************* ...
- sql语句分析是否走索引_mysql sql语句执行时是否使用索引检查方法
在日常开发中,使用到的数据表经常都会有索引,这些索引可能是开发人员/DBA建表时创建的,也可能是在使用过程中新增的.合理的使用索引,可以加快数据库查询速度.然而,在实际开发工作中,会出现有些sql语句 ...
- 覆盖索引与联合索引_MySQL:你知道什么是覆盖索引吗?
什么叫做覆盖索引? 解释一: 就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖. 解释二: 索引是高效找到行的一个方法,当能通过检索索引就可以读取 ...
- mysql 存储过程加密工具_MySQL存储过程调试工具-dbForge Studio for MySQL
对于某些存储过程很多且复杂的SQL的应用,在短时间内要使得所有MySQL存储过程和函数正常运行,那么如果能找到一个比较好的调试工具,就可以事半功倍, 这里介绍的是dbForge Studio for ...
- mysql 命令行访问_Mysql 命令行模式访问操作mysql数据库操作
使用环境 在cmd模式下输入 mysql --version (查看mysql安装的版本). 完整的命令可以通过mysql --help来获取. 本测试使用的Mysql版本是mysql5, 本测试使用 ...
最新文章
- html创建等边三角形,CSS3 等边三角形组成星形图案
- 使用定制的NSDictionary的方法,对NSArray进行排序(附:数组排序两种常见方法)
- 金山毒霸2012正式公测 首次实现新病毒99秒查杀
- WPF中的Pack URI
- 网络经济与企业管理(第 2 章:企业战略管理)
- html css 表头,css固定表格表头(各浏览器通用)
- postgresql编译安装及配置
- oracle数据库修改连接数
- IDEA多款主题颜色推荐!炫酷经典!
- 4、STYLE-------------labview宝典
- 网安信—web3.0是什么?
- 深度学习(图像方向)常见名词术语
- 计算机云维护是做什么的,IT运维是什么?云时代下的运维人员是怎样的?
- 基于JavaGUI的中英文打字训练测试软件设计
- CF513C Maximum Subrectangle
- 敏捷项目的史诗与迭代
- 5s进水不开机怎么办 苹果5s进水后无法开机的维修方法
- scp 远程拷贝文件
- imgbb图床API
- 在行 app android,在行app安卓版