热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

SQL设计与优化

SQL执行流程image.png索引快速定位记录的一种数据结构B+Tree索引等值、范围检索Hash索引等值检索空间索引(R-Tree)地理数据检索(多维)全文索引非结构化数据检索

SQL执行流程

《SQL设计与优化》 image.png

索引
快速定位记录的一种数据结构
B+Tree索引
等值、范围检索
Hash索引
等值检索
空间索引(R-Tree)
地理数据检索(多维)
全文索引
非结构化数据检索
索引作用
减少IO
随机IO转化为顺序IO
减少内存计算(比较、排序)

索引类型
普通索引: 最基本的索引类型,
唯一索引: 索引列的所有值都必须唯一
聚簇索引,二级索引
单列索引,组合索引

特点
多叉平衡树,节点的单位是page
提高select速度
降低(insert,delete,update)速度
根据不同维度,可以建立多个索引

B+Tree索引

《SQL设计与优化》 image.png

非叶子节点是叶子节点的索引
叶子节点是数据层
任一值搜索深度相同
叶子结点组成链表,用于全表扫描

存储容量
Primary Index VS Secondary Index
create table tab(id int primary key,c1 int,index(c1),c2 varchar(128))
– Clustered index key = 4 bytes
– Secondary index key = 4 bytes
– Key pointer = 8 bytes
– Average row length = 200 bytes
– Page size = 16K = 16384 bytes
– Average node occupancy = 70%
– Average row per page(Pri Key) = 16384 * 70% / 200 ≈50
– Average row per page(Sec Key) = 16384 * 70% / (4+8) ≈1000

《SQL设计与优化》 image.png
《SQL设计与优化》 image.png

查询代价估算

《SQL设计与优化》 image.png

SQL代价= Random IO(RO) +
Sequence IO(SO) +
CPU(内存计算)
单表查询
主键查询
SELECT … FROM table whereprimary_key=???
代价:RO(PK-Tree(h))
二级索引查询
SELECT … FROM table where key = ???
代价:RO(Sec-Tree(h)) + N*RO(PK-Tree(h))
全表扫描
SELECT … FROM table where col = ???
代价:SO(PK-Tree)

连接查询
SELECT … FROM a1 join on a2 where a1.name = a2.name
NLJ(Nest Loop Join)
For each tuple r in R do
For each tuple s in S do
If r and s satisfy the join condition Then output the tuple
代价:SO(R-tree) * SO(S-tree)

NLIJ(Nest Loop Index Join)
For each tuple r in R do
lookup r join condition in S index
If found s == r
Then output the tuple
代价:SO(R-tree) * RO(S-tree(h))

表结构设计
降低单条记录长度
提高缓存利用率

将访问频率低、大字段拆分,用主键对应
提高缓存命中率

适当冗余,减少多表join查询

使用信息统计表

索引设计
选择过滤性高的字段
distinct(col)与count(*)比值

Join查询中连接字段建立索引
避免全表扫描

尽量使用覆盖索引
无需访问表,避免随机IO

利用前缀索引
name varchar(128), index(name(16))

避免重复使用索引
(a),(a,b),(a,b,c)

业务确定唯一,建唯一索引

SQL写法
尽量利用索引排序,避免产生临时表
order by col1,col2 index(col1,col2)

避免对查询字段进行计算(类型转换,计算)
where id*2 > 5

避免使用select *

避免使用全模糊查询 like ‘%xxx%’

多SQL综合考虑,保证核心SQL

SQL优化实践

《SQL设计与优化》 image.png

减少磁盘访问
使用索引检索记录
CREATE INDEX idx_abc ON table (A, B, C);
下列查询条件可使用索引(红色部分不能使用索引)
A=5
● A BETWEEN 5 AND 10
● A=5 AND B BETWEEN 5 AND 10
● A BETWEEN 5 AND 10 AND B=5
● A IN (5,6,7,8,9,10) AND B=5
× B=5 and …
× A=5 and B > 5 and C>5
减少磁盘访问
使用覆盖索引
CREATE INDEX idx_ab ON table (A, B);
使用该索引可直接返回结果集
● SELECT A, B FROM table where
[ A=5 AND B BETWEEN 5 AND 10 ]
[ A IN (5,6,7,8,9,10) AND B=5 ]

返回更少的数据
只返回需要的字段
select * from product where company_id=?;
优化:select id,name from product where company_id=?;

优点:
1、减少网络传输开销
2、减少处理开销
3、减少客户端内存占用
4、字段变更时提前发现问题,减少程序BUG
5、有机会使用覆盖索引

减少交互次数
select * from tbl_1 where id in(:id1,id2,…,idn);
优点:
1.减少交互次数
2.减少语法/语义分析,执行计划生成过程
3.建议in不超过20

更新批量提交

《SQL设计与优化》 image.png

减少CPU开销
利用索引排序
CREATE INDEX idx_ab ON table (A, B);
下列查询条件可使用索引(红色部分不能使用索引)
ORDER BY A
● ORDER BY A,B
● ORDER BY A DESC, B DESC
● A=5 ORDER BY B [ASC/DESC]
● A>5 ORDER BY A [ASC/DESC]
● A>5 ORDER BY A,B
× ORDER BY B
× ORDER BY A [ASC/DESC], B[DESC/ASC]
减少“比较”,比如全模糊匹配

执行计划查看
Explain语句
(1).EXPLAIN SELECT ……
(2).EXPLAIN EXTENDED SELECT ……

《SQL设计与优化》 image.png

复习
where后面的条件字段都要建索引?

建一个组合索引还是多个单列索引?

对于and, or , >, <, like等谓词,如何建索引?

使用了索引就一定快?

索引顺序要与where条件中字段顺序一致?

(a,b)还是(b,a)?


推荐阅读
  • MySQL索引详解与优化
    本文深入探讨了MySQL中的索引机制,包括索引的基本概念、优势与劣势、分类及其实现原理,并详细介绍了索引的使用场景和优化技巧。通过具体示例,帮助读者更好地理解和应用索引以提升数据库性能。 ... [详细]
  • 在 Flutter 开发过程中,开发者经常会遇到 Widget 构造函数中的可选参数 Key。对于初学者来说,理解 Key 的作用和使用场景可能是一个挑战。本文将详细探讨 Key 的概念及其应用场景,并通过实例帮助你更好地掌握这一重要工具。 ... [详细]
  • 探索电路与系统的起源与发展
    本文回顾了电路与系统的发展历程,从电的早期发现到现代电子器件的应用。文章不仅涵盖了基础理论和关键发明,还探讨了这一学科对计算机、人工智能及物联网等领域的深远影响。 ... [详细]
  • FinOps 与 Serverless 的结合:破解云成本难题
    本文探讨了如何通过 FinOps 实践优化 Serverless 应用的成本管理,提出了首个 Serverless 函数总成本估计模型,并分享了多种有效的成本优化策略。 ... [详细]
  • 深入解析Redis内存对象模型
    本文详细介绍了Redis内存对象模型的关键知识点,包括内存统计、内存分配、数据存储细节及优化策略。通过实际案例和专业分析,帮助读者全面理解Redis内存管理机制。 ... [详细]
  • 利用决策树预测NBA比赛胜负的Python数据挖掘实践
    本文通过使用2013-14赛季NBA赛程与结果数据集以及2013年NBA排名数据,结合《Python数据挖掘入门与实践》一书中的方法,展示如何应用决策树算法进行比赛胜负预测。我们将详细讲解数据预处理、特征工程及模型评估等关键步骤。 ... [详细]
  • 深入理解Redis的数据结构与对象系统
    本文详细探讨了Redis中的数据结构和对象系统的实现,包括字符串、列表、集合、哈希表和有序集合等五种核心对象类型,以及它们所使用的底层数据结构。通过分析源码和相关文献,帮助读者更好地理解Redis的设计原理。 ... [详细]
  • Redis Hash 数据结构详解
    本文详细介绍了 Redis 中的 Hash 数据类型及其常用命令。Hash 类型用于存储键值对集合,支持多种操作如插入、查询、更新和删除字段值。此外,文章还探讨了 Hash 类型在实际业务场景中的应用,并提供了优化建议。 ... [详细]
  • 尽管深度学习带来了广泛的应用前景,其训练通常需要强大的计算资源。然而,并非所有开发者都能负担得起高性能服务器或专用硬件。本文探讨了如何在有限的硬件条件下(如ARM CPU)高效运行深度神经网络,特别是通过选择合适的工具和框架来加速模型推理。 ... [详细]
  • 本题探讨了在大数据结构背景下,如何通过整体二分和CDQ分治等高级算法优化处理复杂的时间序列问题。题目设定包括节点数量、查询次数和权重限制,并详细分析了解决方案中的关键步骤。 ... [详细]
  • 目录一、salt-job管理#job存放数据目录#缓存时间设置#Others二、returns模块配置job数据入库#配置returns返回值信息#mysql安全设置#创建模块相关 ... [详细]
  • 2018-2019学年第六周《Java数据结构与算法》学习总结
    本文总结了2018-2019学年第六周在《Java数据结构与算法》课程中的学习内容,重点介绍了非线性数据结构——树的相关知识及其应用。 ... [详细]
  • 深入解析Java枚举及其高级特性
    本文详细介绍了Java枚举的概念、语法、使用规则和应用场景,并探讨了其在实际编程中的高级应用。所有相关内容已收录于GitHub仓库[JavaLearningmanual](https://github.com/Ziphtracks/JavaLearningmanual),欢迎Star并持续关注。 ... [详细]
  • PHP 实现多级树形结构:构建无限层级分类系统
    在众多管理系统中,如菜单、分类和部门等模块,通常需要处理层级结构。为了高效管理和展示这些层级数据,本文将介绍如何使用 PHP 实现多级树形结构,并提供代码示例以帮助开发者轻松实现无限分级。 ... [详细]
  • 深入解析Spring启动过程
    本文详细介绍了Spring框架的启动流程,帮助开发者理解其内部机制。通过具体示例和代码片段,解释了Bean定义、工厂类、读取器以及条件评估等关键概念,使读者能够更全面地掌握Spring的初始化过程。 ... [详细]
author-avatar
无V量_897
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有