首页 > 数据库 >阐述常见的一些SQL优化方式

阐述常见的一些SQL优化方式

时间:2024-06-21 23:00:18浏览次数:20  
标签:阐述 使用 查询 索引 SQL table 优化 id

SQL优化

1. 避免不必要的列

这个是老生常谈,但还是经常会出的情况,SQL查询的时候,应该只查询需要的列,而不要包含额外的列,像 select * 这种写法应该尽量避免。

2. 分页优化

在数据量比较大、分页深度较深的情况下,可以考虑以下分页优化方案:

  • 延迟关联(Deferred Join):先通过WHERE条件提取出主键,然后再将该表与原数据表进行关联,通过主键ID提取数据行,而不是使用原有的二级索引提取数据行。这样可以减少关联操作的数据量,提高查询效率。
    例如:
SELECT a.* FROM table a, 
 (SELECT id FROM table WHERE type = 2 AND level = 9 ORDER 
BY id ASC LIMIT 190289, 10) b
WHERE a.id = b.id
  • 书签方式(Bookmark):书签方式是根据LIMIT语句中的第一个参数对应的主键值,通过该主键值进行过滤和限制。先找到满足条件的第一个主键值,然后再根据该主键值进行过滤并进行LIMIT操作。
    例如:
SELECT * FROM table WHERE id > 
 (SELECT id FROM table WHERE type = 2 AND level = 9 ORDER 
BY id ASC) LIMIT 190, 10

3. 索引优化

合理地设计和使用索引,是优化慢SQL的利器。
利用覆盖索引InnoDB使用非主键索引查询数据时会回表,但是如果索引的叶节点中已经包含要查询的字段,那它没有必要再回表查询了,这就叫覆盖索引
例如对于如下查询:

select name from test where city='上海'

我们将被查询的字段建立到联合索引中,这样查询结果就可以直接从索引中获取

alter table test add index idx_city_name (city, name);

4. 低版本避免使用or查询

在 MySQL 5.0 之前的版本要尽量避免使用 or 查询,可以使用 union 或者子查询来替代,因为早期的 MySQL 版本使用 or 查询可能会导致索引失效,高版本引入了索引合并,解决了这个问题。

5. 避免使用 != 或者 <> 操作符

SQL中,不等于操作符会导致查询引擎放弃查询索引,引起全表扫描,即使比较的字段上有索引
解决方法:通过把不等于操作符改成or,可以使用索引,避免全表扫描
例如,把 column<>’aaa’,改成column>’aaa’ or column<’aaa’ ,就可以使用索引了

6.适当使用前缀索引

适当地使用前缀索引,可以降低索引的空间占用,提高索引的查询效率。
比如,邮箱的后缀都是固定的“ @xxx.com ”,那么类似这种后面几位为固定值的字段就非常适合定义为前缀索引

alter table test add index index2(email(6));

PS:需要注意的是,前缀索引也存在缺点,MySQL无法利用前缀索引做order by和group by 操作,也无法作为覆盖索引

7. 避免列上函数运算

要避免在列字段上进行算术运算或其他表达式运算,否则可能会导致存储引擎无法正确使用索引,从而影响了查询的效率

8. 正确使用联合索引

使用联合索引的时候,注意最左匹配原则。

标签:阐述,使用,查询,索引,SQL,table,优化,id
From: https://blog.csdn.net/m0_65013257/article/details/139814940

相关文章

  • 阐述Spring Security概念及其运用于实战
    SpringSecurity(安全校验)1.概述SpringSecurity是Spring项目组提供的安全服务框架,核心功能包括认证和授权.为系统提供了声明式安全访问控制功能,减少了为系统安全而编写大量重复代码的工作.在如今开发模式中,SpringSecurity已经成为Java程序员必备的一项技术,简化认......
  • SQL学习记录 #1、入门:增删改查
    1. 通识SQL语句可以单行或多行书写,以分号结尾。SQL语句可以单独使用空格/缩进来增强语句的可读性。Mysql数据库的SQL语句不区分大小写,关键字建议使用大写。注释:单行注释:-- 注释内容或# 注释内容多行注释:/*注释内容*/2.分类分类概述说明DDL(DataDefinitionLangua......
  • 智能电池充电:使用PID控制器优化SOC(Matlab代码实现)
     ......
  • MySQL数据库技术
    数据库基本概念1.数据库(Database,简称DB)数据库是存放数据的仓库,是长期储存在计算机内、有组织有结构的、可共享的数据集合。2.数据库管理系统(DatabaseManagementSystem,简称DMBS)数据库管理系统是为数据库的建立、使用和维护而配置的数据库管理软件,它位于用户与操作系......
  • [转] MySQL binlog 日志自动清理及手动删除
    参考转载自mysqlbinlog日志自动清理及手动删除-景岳-博客园说明当开启mysql数据库主从时,会产生大量如mysql-bin.00000*log的文件,这会大量耗费您的硬盘空间。mysql-bin.000001mysql-bin.000002mysql-bin.000003mysql-bin.000004mysql-bin.000005…有三种解......
  • MySQL之复制(九)
    复制复制管理和维护确定主备是否一致在理想情况下,备库和主库的数据应该是完全一样的。但事实上备库可能发生错误并导致数据不一致。即使没有明显的错误,备库同样可能因为MySQL自身的特性导致数据不一致,例如MySQL的Bug、网络中断、服务器崩溃,非正常关闭或者其他一些错误。(......
  • MySQL----表级锁&行级锁&排它锁和共享锁&意向锁
    MySQL的锁机制锁(Locking)是数据库在并发访问时保证数据一致性和完整性的主要机制。在MySQL中,不同存储引擎使用不同的加锁方式;我们以InnoDB存储引擎为例介绍MySQL中的锁机制,其他存储引擎中的锁相对简单一些。表级锁&行级锁表级锁:对整张表加锁。开销小,加锁快,不会出现......
  • MySQL----彻底卸载(附带每一步截图)
    停止mysql服务打开任务管理器,点击服务,找到mysql服务,这里我的是MySQL57,找到mysql服务后选中,点击右键选择停止服务删除mysql服务win+R打开命令框,输入cmd打开cmd控制台或者电脑左下角输入cmd搜索,选择管理员身份进入cmd控制台(否则会拒绝访问),弹出是否允许该应用对设备进行修......
  • mysql SHOW PROFILE
    SHOWPROFILE[type[,type]...][FORQUERYn][LIMITrow_count[OFFSEToffset]]type:{ALL|BLOCKIO|CONTEXTSWITCHES|CPU|IPC|MEMORY|PAGEFAULTS|SOURCE|SWAPS}SHOWPROFILE和SHOWPROFILES语句显示分析信息,这些信......
  • 深入探索Edge浏览器的沉浸式阅读器:优化阅读体验的指南
    微软Edge浏览器的沉浸式阅读器是一项强大的功能,旨在通过简化界面和优化阅读设置来提升用户的在线阅读体验。它通过去除页面上的干扰元素,让用户专注于阅读内容。本文将详细介绍如何在Edge浏览器中使用沉浸式阅读器,以及如何通过自定义设置来获得最佳的阅读体验。1.沉浸式阅......