数据库优化原则

article/2025/10/17 3:03:36
最近数据库课程设计,我总结了一下数据库的优化方法,希望对有需要的人能有帮助: 微笑
1.对查询进行优化,尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:
    select id from p where num is null
  可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:
    select id from p where num=0

3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。

4.应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:

    select id from p where num=8 or num=12
  可以这样查询:
    select id from p where num=8union allselect id from p where num=12
5.in 和 not in 也要慎用,否则会导致全表扫描,如:

    select id from p where num in(1,2,3)
对于连续的数值,能用 between 就不要用 in 了:

    select id from p where num between 1 and 3
6.下面的查询也将导致全表扫描:
   select id from p where name like '%abcd%'
  若要提高效率,可以考虑全文检索。

7.如果在 where 子句中使用参数,也会导致全表扫描。因为SQL只有在运行时才会解析局部变量,但优化程序不能将访问计划的选择推迟到运行时;它必须在编译时进行选择。然而,如果在编译时建立访问计划,变量的值还是未知的,因而无法作为索引选择的输入项。如下面语句将进行全表扫描:

    select id from p where num=@number
可以改为强制查询使用索引:

    select id from p with(index(索引名)) where num= @number
8.应尽量避免在 where 子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描。如:

    select id from t where num/2=10
应改为:

select id from t where num=10*2
9.应尽量避免在where子句中对字段进行函数操作,这将导致引擎放弃使用索引而进行全表扫描。如:
select id from t where substring(name,1,3)='abc'--name以abc开头的id
  select id from t where datediff(day,createdate,'2014-12-30')=0--‘2014-12-30’生成的id

10.主键是必要的,SQL SERVER的主键同时是一个唯一索引,而且在实际应用中,我们往往选择最小的键组合作为主键,所以主键往往适合作为表的聚集索引。在有多个键的表,主键的选择也比较重要,一般选择总的长度小的键,小的键的比较速度快,同时小的键可以使主键的B树结构的层次更少。主键的选择还要注意组合主键的字段次序,对于组合主键来说,不同的字段次序的主键的性能差别可能会很大,一般应该选择重复率低、单独或者组合查询可能性大的字段放在前面。

11.数据类型尽量用数字型,数字型的比较比字符型的快很多。

12.数据类型尽量小,这里的尽量小是指在满足可以预见的未来需求的前提下的。

13.尽量不要允许NULL,除非必要,可以用默认值代替。

14.少用TEXT和IMAGE,二进制字段的读写是比较慢的,而且,读取的方法也不多,大部分情况下最好不用。

15.自增字段要慎用,不利于数据迁移。

16.适用文件组可以有效把I/O操作分散到不同的物理硬盘,提高并发能力。

17.一个表不要加太多索引,因为索引影响插入和更新的速度。

18.适当的使用冗余的反范式设计,以空间换时间有的时候会很高效。

19.联表查询的时候,记得把小结果集放在前面,遵循小结果集驱动大结果集的原则。

20.查询尽可能使用limit减少返回的行数,减少数据传输时间和带宽浪费。



http://chatgpt.dhexx.cn/article/y81gdQNL.shtml

相关文章

PHP经典面试题——数据库优化

Mysql数据库优化 PHP学习过程中或者面试过程中少不了的一个重要知识点&#xff0c;那就是关于数据库的优化问题&#xff0c;本人经过查阅资料并验证&#xff0c;总结了几点比较浅层的数据库优化方法&#xff0c;小白可以参考&#xff0c;大神勿喷。 忘了什么时候发现的一张关于…

数据库_EXPLAIN(查询性能优化)

文章目录 前言一、EXPLAIN是什么&#xff1f;二、有什么用&#xff1f;三、Explain 的每个字段3.1、id(必记住)3.2、select_type 3.3、table3.4、type&#xff08;必记住&#xff09;3.5、possible_keys3.6、key3.7、key_len3.8、ref3.9、rows&#xff08;记&#xff09;filter…

数据库性能优化之分布式数据库结构设计优化(一)

Gauss是MPP数据库&#xff0c;MPP指大规模并行处理架构&#xff0c;在非共享集群中&#xff0c;各独立节点通过网络进行数据通信协同计算&#xff0c;非共享集群有完全可伸缩性、高可用、高性能等优势。Gauss采用了Share Nothing架构&#xff0c;即集群各节点相互独立有独立内存…

数据库优化之索引

一、什么是索引 索引是对数据库表中一列或多列的值进行排序的一种结构数据&#xff0c;使用索引可快速访问数据库表中的特定信息。 数据库索引是创建在表的某列上的&#xff0c;并且存储了这一列的所有值。同时存储了指向表中的相应行的指针。 二、索引的分类 唯一索引 唯一…

数据库性能优化方案

数据库优化方案 前言数据库性能优化方案SQL 调优表结构优化硬件优化架构优化分库分表详解分库单应用单数据库多应用单数据库多应用多数据库 分表水平拆分和垂直拆分单库内拆分和多库拆分 分库分表带来的复杂性跨库关联查询分布式事务排序、分页、函数计算问题分布式 ID多数据源…

Escaping closure captures non-escaping parameter 'xx'

新版的Swift闭包做参数默认是noescaping&#xff0c;不再是escaping。 如果函数里执行该闭包&#xff0c;要添加escaping。

Escaping closure captures non-escaping parameter ‘findPeripheral‘

文章目录 1.问题2.原因和解决参考连接 1.问题 2.原因和解决 逃逸闭包前面没有加escaping关键字&#xff0c;加上就可以了&#xff0c;如下图 参考连接 stack overflow 官方文档&#xff1a;Escaping Closures

[plugin:commonjs] Unexpected ‘/‘. Escaping special characters with \ may help.错误分析

错误原因&#xff1a;样式表里使用了//作注释 解决办法&#xff1a;把‘//tab样式’去掉就可以了 补充&#xff1a;css中注释使用‘/**/’

swift3.0中@escaping 和 @noescape 的含义

swift3.0中escaping 和 noescape 的含义 开始用swift语言是很容易的&#xff0c;而且它确实是一门很吸引人的语言。但是随着你频繁的使用&#xff0c;你会逐渐接触到swift更加复杂的结构. 在swift2中&#xff0c;你可能遇到过noescape属性&#xff0c;你有没有花一点时间去理解…

SwiftUI 内功之 ViewBuilder 和escaping 组合使用传递View (教程含源码)

实战需求 SwiftUI 内功之 ViewBuilder 和escaping 组合使用传递View 本文价值与收获 看完本文后,您将能够作出下面的界面 看完本文您将掌握的技能 ViewBuilderescaping基础知识 ViewBuilder 一个自定义参数属性,用于从闭包构造视图。 struct ViewBuilder总览 您通常将…

quote mysql_【原创】11. MYSQL++ 之 Quoting 与 Escaping

1. 综述 其实一看到这两个单词的时候我有点莫名其妙&#xff0c;可能英语没有学好&#xff0c;我的理解就是quoting是“引用”的意思&#xff0c;而Escaping是“逃脱”的意思。后来在看到了作者的TUTORIAL之后才大致明白了两者的意思。 QUOTING大白话就是为SQL语句打上单引号。…

错误日志:Syntax Error: Error: Unexpected ‘/‘. Escaping special characters with \ may help.

在运行Vue项目的时候出现错误&#xff1a; ERROR Failed to compile with 1 error 9:55:33error in ./src/components/index/SimpleHeader/index.vue?vue&t…

swift_041(Swift的@noescape和@escaping)

noescape在swift3.0中已经被废弃&#xff0c;在swift3.0中noescape被用作一个默认值。 escaping属性写在参数类型的前面而不是参数名称的前面。这是swift3里一个新的点。 这里需要先介绍一下escape的概念。当一个闭包当做一个参数传进函数里&#xff0c;这个闭包是在这个函数执…

swift函数参数指针传递inout和@escaping冲突的解决方法

这里写目录标题 需求解决方法容易产生的问题总结 今天深入解决关于函数参数指针的问题。问题是这样&#xff0c;我在swift的一个函数里面&#xff0c;参数里需要传递一个指针类型的Int&#xff0c;但是这个函数里面还有一个逃逸闭包escaping,于是就会报错这样&#xff1a;Escap…

Using the “escape“ directive (legacy escaping) is not allowed when auto-escaping is on with a markup

springboot 2.3.0版本以上&#xff0c;springboot自动引用freemarker模板文件的后缀从.ftl变成了.ftlh <!DOCTYPE html> <#escape x as x?html> <#include "../common/macro.ftl"> <html lang"en"> </html> </#escape&…

Escaping closure captures non-escaping parameter ‘xx‘

新版的Swift闭包做参数默认是noescaping&#xff0c;不再是escaping。 如果函数里执行该闭包&#xff0c;要添加escaping。

Swift中的逃逸闭包(@escaping )与非逃逸闭包(@noescaping)

逃逸闭包 概念&#xff1a;一个接受闭包作为参数的函数&#xff0c;该闭包可能在函数返回后才被调用&#xff0c;也就是说这个闭包逃离了函数的作用域&#xff0c;这种闭包称为逃逸闭包。当你声明一个接受闭包作为形式参数的函数时&#xff0c;你可以在形式参数前写escaping来…

VMware创建Linux虚拟机之(三)Hadoop安装与配置及搭建集群

Hello&#xff0c;world&#xff01; &#x1f412;本篇博客使用到的工具有&#xff1a;VMware16 &#xff0c;Xftp7 若不熟悉操作命令&#xff0c;推荐使用带GUI页面的CentOS7虚拟机 我将使用带GUI页面的虚拟机演示 虚拟机&#xff08;Virtual Machine&#xff09; 指通过…

hadoop安装及简单的使用

hadoop安装及简单的使用 一、hadoop运行环境搭建二、hadoop 目录结构三、hadoop 本地模式四、hadoop 伪分布式模式五、伪分布式 YARN 运行六、伪分布式启动历史服务器七、伪分布式配置日志的聚集八、hadoop 集群模式 一、hadoop运行环境搭建 1.环境准备 安装 hadoop 需要使用 …

hadoop安装(window10)

一、下载和winutils 1.下载&#xff1a;http://archive.apache.org/dist/hadoop/core/ 官网下载&#xff1a;http://hadoop.apache.org/releases.html &#xff08;提供最新的几个版本&#xff09; https://github.com/steveloughran/winutils&#xff08;windows安装需要&…