【MySQL】MySQL的优化(五)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 【MySQL】MySQL的优化(五)

使用索引优化

索引是数据库优化最常用也是最重要的手段之一, 通过索引通常可以帮助用户解决大多数的MySQL

的性能优化问题。

数据准备

1. create table `tb_seller` (
2.     `sellerid` varchar (100),
3.     `name` varchar (100),
4.     `nickname` varchar (50),
5.     `password` varchar (60),
6.     `status` varchar (1),
7.     `address` varchar (100),
8.     `createtime` datetime,
9. primary key(`sellerid`)
10. ); 
11. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('alibaba','阿里巴巴','阿里小店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
12. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('baidu','百度科技有限公司','百度小店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
13. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('huawei','华为科技有限公司','华为小店','e10adc3949ba59abbe56e057f20f883e','0','北京市','2088-01-01 12:00:00');
14. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('itcast','传智播客教育科技有限公司','传智播客','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
15. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('itheima','黑马程序员','黑马程序员','e10adc3949ba59abbe56e057f20f883e','0','北京市','2088-01-01 12:00:00');
16. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('luoji','罗技科技有限公司','罗技小店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
17. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('oppo','OPPO科技有限公司','OPPO官方旗舰店','e10adc3949ba59abbe56e057f20f883e','0','北京市','2088-01-01 12:00:00');
18. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('ourpalm','掌趣科技股份有限公司','掌趣小店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
19. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('qiandu','千度科技','千度小店','e10adc3949ba59abbe56e057f20f883e','2','北京市','2088-01-01 12:00:00');
20. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('sina','新浪科技有限公司','新浪官方旗舰店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
21. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('xiaomi','小米科技','小米官方旗舰店','e10adc3949ba59abbe56e057f20f883e','1','西安市','2088-01-01 12:00:00');
22. insert into `tb_seller` (`sellerid`, `name`, `nickname`, `password`, `status`, `address`, `createtime`) values('yijia','宜家家居','宜家家居旗舰店','e10adc3949ba59abbe56e057f20f883e','1','北京市','2088-01-01 12:00:00');
1. -- 创建组合索引 
2. create index idx_seller_name_sta_addr on tb_seller(name,status,address);

避免索引失效应用-全值匹配

该情况下,索引生效,执行效率高。

explain select * from tb_seller where name='小米科技' and status='1' and address='北京市';

避免索引失效应用-最左前缀法则

该情况下,索引生效,执行效率高。

1. -- 最左前缀法则
2. -- 如果索引了多列,要遵守最左前缀法则。指的是查询从索引的最左前列开始,并且不跳过索引中的列。
3. explain select * from tb_seller where name='小米科技'; -- 403
4.  
5. explain select * from tb_seller where name='小米科技' and status='1'; -- 410
6. explain select * from tb_seller where  status='1' and name='小米科技'; -- 410
7. -- 违法最左前缀法则 , 索引失效:
8. explain select * from tb_seller where status='1'; -- nulll
9.  
10. -- 如果符合最左法则,但是出现跳跃某一列,只有最左列索引生效:
11. explain select * from tb_seller where name='小米科技'  and address='北京市'; -- 403

避免索引失效应用-其他匹配原则

该情况下,索引生效,执行效率高。

1. -- 范围查询右边的列,不能使用索引 。 
2. explain select * from tb_seller where name='小米科技' and status >'1' and address='北京市’; 
3. 
4. -- 不要在索引列上进行运算操作, 索引将失效。 
5. explain select * from tb_seller where substring(name,3,2)='科技’ 
6. 
7. -- 字符串不加单引号,造成索引失效。 
8. explain select * from tb_seller where name='小米科技' and status = 1 ;
9. 
10. -- 1、范围查询右边的列,不能使用索引 。
11. -- 根据前面的两个字段name , status 查询是走索引的, 但是最后一个条件address 没有用到索引。
12. explain select * from tb_seller where name='小米科技' and status >'1' and address='北京市';
13.  
14. -- 2、不要在索引列上进行运算操作, 索引将失效。
15. explain select * from tb_seller where substring(name,3,2)='科技'
16.  
17. -- 3、字符串不加单引号,造成索引失效。 
18. explain select * from tb_seller where name='小米科技' and status = 1 ;
19.  
20. -- 4、尽量使用覆盖索引,避免select *
21. -- 需要从原表及磁盘上读取数据
22. explain select * from tb_seller where name='小米科技'  and address='北京市';  -- 效率低
23.  
24. -- 从索引树中就可以查询到所有数据
25. explain select name from tb_seller where name='小米科技'  and address='北京市';  -- 效率高
26. explain select name,status,address from tb_seller where name='小米科技'  and address='北京市';  -- 效率高
27. -- 如果查询列,超出索引列,也会降低性能。
28. explain select name,status,address,password from tb_seller where name='小米科技'  and address='北京市';  -- 效率低
29. 
30. 
31. -- 尽量使用覆盖索引,避免select *
32. -- 需要从原表及磁盘上读取数据
33. explain select * from tb_seller where name='小米科技'  and address='北京市';  -- 效率低
34.  
35. -- 从索引树中就可以查询到所有数据
36. explain select name from tb_seller where name='小米科技'  and address='北京市';  -- 效率高
37. explain select name,status,address from tb_seller where name='小米科技'  and address='北京市';  -- 效率高
38. -- 如果查询列,超出索引列,也会降低性能。
39. explain select name,status,address,password from tb_seller where name='小米科技'  and address='北京市';  -- 效率低
40. 
41. -- 用or分割开的条件, 那么涉及的索引都不会被用到。
42. explain select * from tb_seller where name='黑马程序员' or createtime = '2088-01-01 12:00:00'; 
43. explain select * from tb_seller where name='黑马程序员' or address = '西安市';  
44. explain select * from tb_seller where name='黑马程序员' or status = '1';   
45.  
46. -- 以%开头的Like模糊查询,索引失效。
47. explain select * from tb_seller where name like '科技%'; -- 用索引
48. explain select * from tb_seller where name like '%科技'; -- 不用索引
49. explain select * from tb_seller where name like '%科技%';-- 不用索引
50. -- 弥补不足,不用*,使用索引列
51. explain select name from tb_seller where name like '%科技%';
52. 
53.  
54. --  1、如果MySQL评估使用索引比全表更慢,则不使用索引。
55. -- 这种情况是由数据本身的特点来决定的
56. create index index_address on tb_seller(address);
57.  
58. explain select * from tb_seller where address = '北京市'; -- 没有使用索引
59. explain select * from tb_seller where address = '西安市'; -- 没有使用索引
60.  
61.  
62. --  2、is  NULL , is NOT NULL  有时有效,有时索引失效。
63. create index index_address on tb_seller(nickname);
64. explain select * from tb_seller where nickname is NULL;  -- 索引有效
65. explain select * from tb_seller where nickname is not NULL; -- 无效


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1天前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
6天前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
22 3
|
8天前
|
缓存 关系型数据库 MySQL
如何优化 MySQL 数据库的性能?
【10月更文挑战第28天】
28 1
|
16天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万级数据统计优化实践
【10月更文挑战第21天】 在处理大规模数据集时,传统的单体数据库解决方案往往力不从心。MySQL和Redis的组合提供了一种高效的解决方案,通过将数据库操作与高速缓存相结合,可以显著提升数据处理的性能。本文将分享一次实际的优化案例,探讨如何利用MySQL和Redis共同实现百万级数据统计的优化。
46 9
|
16天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:优化百万数据查询的实战经验
【10月更文挑战第13天】 在处理大规模数据集时,传统的关系型数据库如MySQL可能会遇到性能瓶颈。为了提升数据处理的效率,我们可以结合使用MySQL和Redis,利用两者的优势来优化数据查询。本文将分享一次实战经验,探讨如何通过MySQL与Redis的协同工作来优化百万级数据统计。
42 5
|
21天前
|
存储 关系型数据库 MySQL
优化 MySQL 的锁机制以提高并发性能
【10月更文挑战第16天】优化 MySQL 锁机制需要综合考虑多个因素,根据具体的应用场景和需求进行针对性的调整。通过不断地优化和改进,可以提高数据库的并发性能,提升系统的整体效率。
29 1
|
21天前
|
缓存 关系型数据库 MySQL
一文彻底弄懂MySQL优化之深度分页
【10月更文挑战第24天】本文深入探讨了 MySQL 深度分页的原理、常见问题及优化策略。首先解释了深度分页的概念及其带来的性能和资源问题。接着介绍了基于偏移量(OFFSET)和限制(LIMIT)以及基于游标的分页方法,并分析了它们的优缺点。最后,提出了多种优化策略,包括合理创建索引、优化查询语句和使用数据缓存,帮助提升分页查询的性能和系统稳定性。
|
24天前
|
NoSQL 关系型数据库 MySQL
MySQL与Redis协同作战:百万数据量的优化实录
【10月更文挑战第6天】 在现代互联网应用中,随着用户量的增加和业务逻辑的复杂化,数据量级迅速增长,这对后端数据库系统提出了严峻的挑战。尤其是当数据量达到百万级别时,传统的数据库解决方案往往会遇到性能瓶颈。本文将分享一次使用MySQL与Redis协同优化大规模数据统计的实战经验。
92 3
|
24天前
|
NoSQL 关系型数据库 BI
记录一次MySQL+Redis实现优化百万数据统计的方式
【10月更文挑战第13天】 在处理百万级数据的统计时,传统的单体数据库往往力不从心,这时结合使用MySQL和Redis可以显著提升性能。以下是一次实际优化案例的详细记录。
87 1
|
1月前
|
SQL 关系型数据库 MySQL
在日常工作中怎么做MySQL优化的?
在日常工作中怎么做MySQL优化的?
下一篇
无影云桌面