Mysql索引失效情况及避免方式【案例分析】

news2024/11/17 20:39:13

索引失效情况及避免方式

建表+数据sql

CREATE TABLE staffs(
id INT PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(24)NOT 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());

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YCctVEVL-1687839189065)(assets/1687839053755-58.png)]

创建复合索引

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

索引失效相关法则

  • 全值匹配我最爱。
  • 最佳左前缀法则。
  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。
  • 索引中范围条件右边的字段会全部失效。
  • 尽量使用覆盖索引(只访问索引的查询,索引列和查询列一致),减少SELECT *
  • MySQL在使用!=或者<>的时候无法使用索引会导致全表扫描。
  • is nullis not null也无法使用索引。
  • like以通配符开头%abc索引失效会变成全表扫描(使用覆盖索引就不会全表扫描了)。
  • 字符串不加单引号索引失效。
  • 少用or,用它来连接时会索引失效。

全值匹配我最爱

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

最佳左前缀法则

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';
EXPLAIN SELECT * FROM staffs WHERE NAME = 'July' AND pos ='dev';
EXPLAIN SELECT * FROM staffs WHERE age = 25 AND pos ='dev';
EXPLAIN SELECT * FROM staffs WHERE pos ='dev';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SuIpAGwY-1687839189066)(assets/1687839053755-59.png)]

没有带头大哥,全表扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EHr4fSKh-1687839189067)(assets/1687839053755-60.png)]

中间兄弟断了,只能用到部分索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l3l0hAVF-1687839189067)(assets/1687839053755-61.png)]

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

口诀:带头大哥不能死,中间兄弟不能断,后面可以没有。(可以参考列车,车头不能没有,中间车厢不能没有,后面车厢没有也可以开)

索引列上不能做任何操作(如计算、函数、类型转换)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VpNISCj3-1687839189067)(assets/1687839053755-62.png)]

口诀:索引列上不计算。

索引中范围条件右边的字段会全部失效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nv9HMBJW-1687839189067)(assets/1687839053755-63.png)]

当然,还是用到了age列的索引的,看key_len是78就知道了,不用到的话,key_len是74

由此可知,查询范围的字段使用到了索引,但是范围之后的索引字段会失效。

口诀:范围之后全失效。

尽量用覆盖索引,减少select*使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVWtvaea-1687839189068)(assets/1687839053755-64.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TJ2km6FP-1687839189068)(assets/1687839053755-65.png)]

口诀:查询一定不用\*

MySQL在使用!=或者<>的时候无法使用索引会导致全表扫描

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yoWALgU4-1687839189068)(assets/1687839053755-66.png)]

虽然索引会失效,但是业务需要的话,没办法还是要写的

is nullis not null也无法使用索引

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SwBKqbmb-1687839189068)(assets/1687839053755-67.png)]

like百分加右边

建表sql

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;

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');

案例

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2EriXhgA-1687839189068)(assets/1687839053755-68.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bxeJxu6a-1687839189069)(assets/1687839053755-69.png)]

生产环境中就要使用两边%,怎么优化,希望索引不失效,使用覆盖索引来解决

创建索引sql

CREATE INDEX idx_user_nameAger ON tbl_user(NAME,age);

查询sql

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wS2tIdHo-1687839189069)(assets/1687839053755-70.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sc2YGPJZ-1687839189069)(assets/1687839053755-71.png)]

id是主键索引,虽然不在复合索引内部,但是查询的时候也可以被使用上

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vsWh4lQy-1687839189069)(assets/1687839053755-72.png)]

上面的索引都没有失效

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lISzd5kO-1687839189069)(assets/1687839053755-73.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ym62YQrf-1687839189069)(assets/1687839053755-74.png)]

口诀:覆盖索引保两边。

字符要加单引号

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RZX7sqo0-1687839189069)(assets/1687839053755-75.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r5Y1mpFC-1687839189070)(assets/1687839053755-76.png)]

因为,mysql底层会自动做类型转换,将数据转化为了字符串,其实就是对索引列做了操作

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zW5OTcm4-1687839189070)(assets/1687839053756-77.png)]

口诀:字符要加单引号。

除此之外,要避免其他隐式转换

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bgONPy9T-1687839189070)(assets/1687839053756-78.png)]

索引相关题目

假设index(a,b,c)

Where语句索引是否被使用
where a = 3Y,使用到a
where a = 3 and b = 5Y,使用到a,b
where a = 3 and b = 5Y,使用到a,b,c
where b = 3 或者 where b = 3 and c = 4 或者 where c = 4N,没有用到a字段
where a = 3 and c = 5使用到a,但是没有用到c,因为b断了
where a = 3 and b > 4 and c = 5使用到a,b,但是没有用到c,因为c在范围之后
where a = 3 and b like ‘kk%’ and c = 4Y,a,b,c都用到
where a = 3 and b like ‘%kk’ and c = 4只用到a
where a = 3 and b like ‘%kk%’ and c = 4只用到a
where a = 3 and b like ‘k%kk%’ and c = 4Y,a,b,c都用到

面试题分析

建表sql

CREATE TABLE test03(
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,
c1 CHAR(10),
c2 CHAR(10),
c3 CHAR(10),
c4 CHAR(10),
c5 CHAR(10)
);

INSERT INTO test03(c1,c2,c3,c4,c5) VALUES('a1','a2','a3','a4','a5');
INSERT INTO test03(c1,c2,c3,c4,c5) VALUES('b1','b2','b3','b4','b5');
INSERT INTO test03(c1,c2,c3,c4,c5) VALUES('c1','c2','c3','c4','c5');
INSERT INTO test03(c1,c2,c3,c4,c5) VALUES('d1','d2','d3','d4','d5');
INSERT INTO test03(c1,c2,c3,c4,c5) VALUES('e1','e2','e3','e4','e5');


CREATE INDEX idx_test03_c1234 ON test03(c1,c2,c3,c4);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZe9zXpV-1687839189070)(assets/1687839053756-79.png)]

案例

-- 1.全值匹配 用到索引c1 c2 c3 c4全字段 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c3 = 'a3' AND c4 = 'a4';

-- 2.用到索引c1 c2 c3 c4全字段 MySQL的查询优化器会优化SQL语句的顺序
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c4 = 'a4' AND c3 = 'a3';

-- 3.用到索引c1 c2 c3 c4全字段 MySQL的查询优化器会优化SQL语句的顺序
EXPLAIN SELECT * FROM test03 WHERE c4 = 'a4' AND c3 = 'a3' AND c2 = 'a2' AND c1 = 'a1';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPHQyP7M-1687839189070)(assets/1687839053756-80.png)]

虽然sql中字段的顺序和创建索引时的字段顺序的不同,但是sql优化器可以解析成相同顺序的。但是最好索引怎么创建的,就怎么用,避免sql再去翻译一次

-- 4.用到索引c1 c2 c3字段,c4字段失效,范围之后全失效 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c3 > 'a3' AND c4 = 'a4';

-- 5.用到索引c1 c2 c3 c4全字段 MySQL的查询优化器会优化SQL语句的顺序
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c4 > 'a4' AND c3 = 'a3';

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-keK8weOM-1687839189070)(assets/1687839053756-81.png)]

-- 6.用到了索引c1 c2 c3三个字段, c1和c2两个字段用于查找,  c3字段用于排序了但是没有统计到key_len中,c4字段失效
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c4 = 'a4' ORDER BY c3;
-- 7.用到了索引c1 c2 c3三个字段,c1和c2两个字段用于查找, c3字段用于排序了但是没有统计到key_len中
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' ORDER BY c3;
-- 8.用到了索引c1 c2两个字段,c4失效,c1和c2两个字段用于查找,c4字段排序产生了Using filesort说明排序没有用到c4字段 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' ORDER BY c4;
-- 9.用到了索引c1 c2 c3三个字段,c1用于查找,c2和c3用于排序 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c5 = 'a5' ORDER BY c2, c3;
-- 10.用到了c1一个字段,c1用于查找,c3和c2两个字段索引失效(没有按照顺序),产生了Using filesort 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c5 = 'a5' ORDER BY c3, c2;
-- 11.用到了c1 c2 c3三个字段,c1 c2用于查找,c2 c3用于排序 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND  c2 = 'a2' ORDER BY c2, c3;
-- 12.用到了c1 c2 c3三个字段,c1 c2用于查找,c2 c3用于排序 
EXPLAIN SELECT *  FROM test03 WHERE c1 = 'a1' AND  c2 = 'a2' AND c5 = 'a5' ORDER BY c2, c3;
--   13.用到了c1 c2 c3三个字段,c1 c2用于查找,c2 c3用于排序 没有产生Using filesort 
--      因为之前c2这个字段已经确定了是'a2'了,这是一个常量,再去ORDER BY c3,c2 这时候c2已经不用排序了!
--      所以没有产生Using filesort 和(10)进行对比学习!
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c2 = 'a2' AND c5 = 'a5' ORDER BY c3, c2;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pOGntbWa-1687839189070)(assets/1687839053756-82.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MxHCxCtU-1687839189071)(assets/1687839053756-83.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-pluao0Cc-1687839189071)(assets/1687839053756-84.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b7EZL6H6-1687839189071)(assets/1687839053756-85.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NsvtaOUR-1687839189071)(assets/1687839053756-86.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jasFac5J-1687839189071)(assets/1687839053756-87.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ETYErY2i-1687839189071)(assets/1687839053756-88.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2aNFfVyd-1687839189071)(assets/1687839053756-89.png)]

-- 14.用到c1 c2 c3三个字段,c1用于查找,c2 c3用于排序,c4失效 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c4 = 'a4' GROUP BY c2,c3;

-- 15.用到c1这一个字段,c4失效,c2和c3排序失效产生了Using filesort 
EXPLAIN SELECT * FROM test03 WHERE c1 = 'a1' AND c4 = 'a4' GROUP BY c3,c2;
GROUP BY基本上都需要进行排序,索引优化几乎和ORDER BY一致,但是GROUP BY会有临时表的产生。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-79QCKjsS-1687839189071)(assets/1687839053756-90.png)]

group by表面上是叫做分组,但是分组之前必定排序,会有临时表产生。 group by的排序法则、索引原则与order by几乎是一致的,有一个不一致的地方,group by有having

总结

索引优化的一般性建议:

  • 对于单值索引,尽量选择针对当前query过滤性更好的索引。
  • 在选择复合索引的时候,当前query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
  • 在选择复合索引的时候,尽量选择可以能够包含当前query中的where子句中更多字段的索引。
  • 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的。

口诀:

  • 带头大哥不能死
  • 中间兄弟不能断
  • 索引列上不计算
  • 范围之后全失效
  • 覆盖索引尽量用
  • 不等有时会失效
  • like百分加右边
  • 字符要加单引号
  • 一般SQL少用or

索引建立与优化[案例分析]

单表案例

建表sql

CREATE TABLE IF NOT EXISTS `article`(
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`author_id` INT (10) UNSIGNED NOT NULL,
`category_id` INT(10) UNSIGNED NOT NULL , 
`views` INT(10) UNSIGNED NOT NULL , 
`comments` INT(10) UNSIGNED NOT NULL,
`title` VARBINARY(255) NOT NULL,
`content` TEXT NOT NULL
);

insert into `article`(author_id,category_id,views,comments,title,content) values
(1,1,1,1,'1','1'),
(2,2,2,2,'2','2'),
(1,1,3,3,'3','3');

查询category_id为1且comments大于1的情况下,views最多的article_id

查询数据

SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NDa6iijv-1687848419304)(assets/1687838420135-19.png)]

查看sql的分析报告

EXPLAIN SELECT id,author_id FROM article WHERE category_id = 1 AND comments > 1 ORDER BY views DESC LIMIT 1

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VRHr0TCi-1687848419304)(assets/1687838420110-1.png)]

查看索引

show index from article

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5cWJ3fbs-1687848419305)(assets/1687838420110-2.png)]

【优化1:创建索引】

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Eatwek3C-1687848419305)(assets/1687838420110-3.png)]

CREATE INDEX idx_article_ccv ON article(category_id,comments,views);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e6E4tizX-1687848419305)(assets/1687838420110-4.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Tptkic4K-1687848419306)(assets/1687838420110-5.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPB92qaO-1687848419306)(assets/1687838420110-6.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhNSOyyf-1687848419306)(assets/1687838420110-7.png)]

**所以,范围之后的索引会失效。**说明这个索引建得不好,先删除

DROP INDEX idx_article_ccv ON article

【优化2:绕过comments直接给category_id,views创建索引】

CREATE INDEX idx_article_cv ON article(category_id,views);

在这里插入图片描述

两表案例

建表sql

CREATE TABLE IF NOT EXISTS `class`(
`id` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`card` INT (10) UNSIGNED NOT NULL
);
CREATE TABLE IF NOT EXISTS `book`(
`bookid` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`card` INT (10) UNSIGNED NOT NULL
);

insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));
insert into class(card) values(floor(1+(rand()*20)));

insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));
insert into book(card) values(floor(1+(rand()*20)));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QIdntA7u-1687848419307)(assets/1687838420110-9.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-10M4PNv4-1687848419307)(assets/1687838420110-10.png)]

class表 左连接 book表

EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BXwJovPN-1687848419307)(assets/1687838420110-11.png)]

有ALL,需要优化

【优化1:给右表book.card创建索引】

CREATE INDEX idx_book_card ON book(card);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oGBR4uqc-1687848419307)(assets/1687838420110-12.png)]

【优化2:给左表class.card创建索引】

CREATE INDEX idx_class_card ON class(card);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Qqxl3SsE-1687848419307)(assets/1687838420110-13.png)]

结论:左连接,索引加右表;右连接,索引加左表。因为左表的数据本身就全都要有。但是DBA建立索引要考虑的是全局sql,不能因为一个sql不好就换索引,我们要让sql来适应索引,比如两个表的位置交换、左连接换成右连接

三表案例

建表

在前面表的基础上加上这个

CREATE TABLE IF NOT EXISTS `phone`(
`phoneid` INT(10) UNSIGNED NOT NULL PRIMARY KEY AUTO_INCREMENT,
`card` INT (10) UNSIGNED NOT NULL
)ENGINE = INNODB;

insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));
insert into phone(card) values(floor(1+(rand()*20)));

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xqmwRSXz-1687848419308)(assets/1687838420110-14.png)]

三表连接查询

EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card LEFT JOIN phone ON book.card=phone.card;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eyQlazNB-1687848419308)(assets/1687838420110-15.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SExQwJcg-1687848419308)(assets/1687838420110-16.png)]

【优化:添加索引】

CREATE INDEX idx_book_card ON book(card);
CREATE INDEX idx_phone_card ON phone(card);

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RcP0In2c-1687848419308)(assets/1687838420110-17.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-N9ReWiGv-1687848419309)(assets/1687838420111-18.png)]

Join语句优化:

  • 尽可能减少Join语句中的循环嵌套次数
  • 用小数据的表来驱动大数据的表,如用数据类别表来驱动书籍表
  • 优先优化NestedLoop(嵌套循环)的内存循环
  • 保证Join的驱动表的Join条件字段已经被索引,对于EXPLAIN SELECT * FROM class LEFT JOIN book ON class.card=book.card;,要保证book.card被索引
  • 当无法保证被驱动表的Join条件字段被索引且内存资源充足的前提下,不要太吝惜JoinBuffer的设置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/692320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

json数据、日期数据的参数传递及响应

文章目录 1.json数据传参1.1 postman如何发送json数据1.2 发送json数据&#xff0c;控制器如何接收 2. 日期类型参数传递2.1 日期类型参数如何指定格式 3.响应数据3.1 ResponseBody注解的使用 1.json数据传参 首先在maven中添加json坐标 1.1 postman如何发送json数据 1.2 发…

00后测试用例写的实在是.......

实在是太强了&#xff0c;00后测试用例写的比我还好&#xff0c;简直是无地自容… 经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 如何编写测试用例&#xff1f; 作为一个测试新人…

以太网频谱

Speed频谱100BASE-TX1GBASE-T2.5GBASE-T5GBASE-T10GBASE-T

网络程序——定时器

网络程序还有一种需要处理的常用事件——定时事件。服务器程序通常管理着众多定时事件&#xff0c;因此如何有效地组织这些定时事件&#xff0c;使之能在预期的时间点被触发且不影响服务器的主要逻辑&#xff0c;对于服务器的性能有着至关重要的影响。为此&#xff0c;我们要将…

递归 到底应该怎么理解?怎么写递归的代码

今天和大家一起来讨论一下递归&#xff1a; 我们尽可能使按照解题的思路来讨论递归&#xff0c;对于这个在计算机内部具体是怎样实现的&#xff0c;我们不做深入讨论&#xff0c;这里仅仅是简单的讨论一下&#xff1a; 求1 ~ n序列的和&#xff1a;1 2 3 ... n&#xff1…

pwn学习day1——ELF文件结构

0x01 介绍 ELF&#xff08;Executable and Linkable Format&#xff09;是一种常见的可执行文件和共享库格式&#xff0c;其结构如下&#xff1a; ELF header&#xff1a;包含了 ELF 文件的基本属性信息。Program header table&#xff1a;描述了程序在内存中的加载情况&…

Gogs私服搭建

1. Gogs介绍 官网地址&#xff1a;https://gogs.io 文档地址&#xff1a;https://gogs.io/docs Gogs&#xff0c;全称为Go Git Service&#xff0c;是一个基于 Go 语言开发的Git服务。它提供了一个类似于GitHub的界面和功能&#xff0c;允许您在自己的服务器上搭建私有的Git仓库…

幂律智能联合智谱AI发布千亿参数级法律垂直大模型PowerLawGLM

前言 2023年是当之无愧的“大模型之年”&#xff0c;据瑞银集团的一份报告显示&#xff0c;ChatGPT推出仅仅两个月后&#xff0c;月活用户已经突破了1亿&#xff0c;成为史上用户增长速度最快的消费级应用程序。 在炙热的大模型赛道里&#xff0c;基于中文大模型的发布也是层…

二叉树OJ题:LeetCode--104.二叉树的最大深度

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;本期来给大家解读一下LeetCode中第104道二叉树OJ题&#xff0c;如果看完之后对你有一定的启发&#xff0c;那么请留下你的三连&#xff0c;祝大家心想事成&#xff01; 数据结构与算法专栏&#xff1a;数据结构与算法 个 人…

SAP从入门到放弃系列之工艺路线-子工序-Part2

文章目录 概述使用场景子工序内容1、 维护工序控制码2、维护子工序的工资类型3、作业标准值4、用户定义字段5、通过维护子工序的作业类型数据后&#xff0c;点击汇总标准值&#xff0c;工序的作业类型值可以通过子工序进行累计6、可以设置子工序是否带入生产订单 注意事项&…

selenium通过xpath定位text换行的元素

DOM元素&#xff08;该元素是换行的&#xff0c;不能通过普通xpath定位&#xff09;&#xff1a; 可使用下面xpath定位该div //div[./text()/following-sibling::text()"点" and ./text()"5"] 解释一下就是&#xff1a;定位“子节点的text是[5] 且 子节点…

自然语言处理(概念)

1、 RNN模型简介 1.2传统RNN模型 2、LSTM模型 3、GRU模型 5、注意力机制 6、人名分类器 7 、BERT 8、Transformer 的结构是什么样子的&#xff1f; 各个子模块有什么作用&#xff1f; 8.1 Encoder模块 8.2 Decoder模块 8.3 Transformer 结构中的Decoder端具体输入是什么&#…

C# wpf 附加属性实现任意控件拖动调整大小

摘自这里 https://blog.csdn.net/u013113678/article/details/121719278 调试效果如下 using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows; using Syst…

vue修改数据后页面不重新渲染

使用vue&#xff0c;遇到几次修改了对象的属性后&#xff0c;页面并不重新渲染 一、直接添加属性的问题 <template><div><p v-for"(value,key) in item" :key"key">{{ value }}</p><button click"addProperty">…

【Linux】在Ubuntu下部署nginx——nginx的负载均衡

介绍 这里是小编成长之路的历程&#xff0c;也是小编的学习之路。希望和各位大佬们一起成长&#xff01; 以下为小编最喜欢的两句话&#xff1a; 要有最朴素的生活和最遥远的梦想&#xff0c;即使明天天寒地冻&#xff0c;山高水远&#xff0c;路远马亡。 一个人为什么要努力&a…

vs中的一些编码问题

1. 基本概念 文件编码格式 首先vs中编辑&#xff0c;保存文件实际上也是将文件内容以一定的编码格式存储。对于中文字符串 string s "一"; 按不同的编码格式保存后&#xff0c;通过16进制文件查看器&#xff0c;可以看到中文的编码是能对应上的。 开放高级保存…

select和pselect的关于信号打断的实验

select和pslect的man手册 SELECT(2) Linux Programmers Manual SELECT(2)NAMEselect, pselect, FD_CLR, FD_ISSET, FD_SET, FD_ZERO - synchronous I/O …

【HDFS实战】HDFS联合(联邦)集群的发展史

HDFS联合集群的发展史 文章目录 HDFS联合集群的发展史HDFS原始架构方案一 HDFS Federation方案二 ViewFs方案三 HDFS Router-based Federation常用命令常用配置RPC serverConnection to the NamenodesAdmin serverHTTP ServerState StoreRoutingNamenode monitoring 版本相关is…

nestJS打印多层对象以及铺平金额类型

console.dir(ret, { depth: 3 }); 金额是Decimal类型不好显示 Logger.verbose(JSON.stringify(ret, null, 2)); 利用JSON.stringify参数格式化 null: 不对数据进行提取&#xff0c; 2&#xff1a;缩进两个空格&#xff0c; 效果是直接帮忙平铺金额对象

java.lang.IllegalStateException Unable to find a @SpringBootConfiguration代码报错

文章目录 一. 问题场景二. 报错原因三. 解决方案 一. 问题场景 使用idea基于springBoot的项目进行单元测试时&#xff0c;出现异常&#xff0c;如下所示&#xff1a; Test ignored.java.lang.IllegalStateException: Unable to find a SpringBootConfiguration, you need to …