SQL优化经验大全(表设计优化,索引优化,索引创建规则、索引失效场景,sql语句优化,主从复制,分库分表)面试题

目录

1.表的设计优化

2.索引优化

2.1 索引创建的规则

2.2 索引失效的场景

3.SQL语句优化

4.主从复制、读写分离

5.分库分表

5.1.怎么判断项目是需要分库还是要分表?

5.2 分库分表有哪些拆分方案?

5.2.1 垂直分库

5.2.2 垂直分表

5.2.3 水平分库

5.2.4 水平分表

5.3 分库分表带来的问题

6.面试回答


SQL可以分为以下5个方面,下面我会挨个阐述:

1.表的设计优化

2.索引优化

3.sql语句优化

4.主从复制、读写分离

5.分库分表

1.表的设计优化

参考了阿里的开发手册(嵩山版)

例如:

①比如设置合适的数值(tinyint,int,bigint),要根据实际情况选择
②比如设置合适的字符串类型(char和varchar)char定长效率高,varchar可变长度,效率稍低

2.索引优化

遵循索引创建的规则,避免索引失效的场景

2.1 索引创建的规则

1.针对于数据量较大,且查询比较频繁的表建立索引。单表超过10万数据(增加用户体验)。

2.针对于常作为查询条件(where)、排序(orderby)、分组(groupby)操作的字段建立索引。

3.数据库中大量重复的列不应该建立索引,例如性别。

4.长文本字段使用前缀索引,或者放入es中。

如果是字符串类型的字段,字段的长度较长,可以针对于字段的特点,建立前缀索引(选取字符串前几个字符)。

5.尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,避免回表,提高查询效率

6.索引并不是越多越好,索引越多,维护索引结构的代价也就越大,会影响增删改的效率。

频繁更新的表不应该建立索引,对于频繁进行插入、更新和删除操作的表,索引会导致额外的维护开销,因为每次数据变更时都需要更新索引,这会影响性能。

7.如果索引列不能存储NULL值,请在创建表时使用NOT NULL约束它。当优化器知道每列是否包含NULL值时,它可以更好地确定哪个索引 最有效地用于查询

8.数据库较小的表,不要建立索引,因为可能走全表扫描

2.2 索引失效的场景

1  使用了联合索引却不符合最左前缀匹配原则

举个例子:小鱼对 user 表建立了一个联合索引为 name_age_id 的联合索引。 他使用以下 SQL 查询select * from user where age = 10 and id = 1; 这样的写法恰恰不满足最左前缀原则,索引就失效啦。

详细解释:

MySQL中,索引的“最左前缀原则”是指在使用索引进行查询时,索引会从左到右匹配列。如果查询条件中包含了索引的最左列,那么索引就可以被使用;如果没有包含最左列,那么索引可能不会被使用。

在上面例子中,小鱼建立了一个名为name_age_id的联合索引,这意味着索引的顺序是nameageid。这个索引可以支持以下几种查询条件:

  1. name列:WHERE name = '某个值'
  2. nameage列:WHERE name = '某个值' AND age = 某个值
  3. nameageid列:WHERE name = '某个值' AND age = 某个值 AND id = 某个值

但是,如果查询条件只包含ageid,而不包含name,那么索引可能不会被使用,因为name是索引的最左列。这是因为索引的最左前缀原则要求查询条件必须包含索引的最左列。

2.索引中使用了运算

例如这个 SQL select * from user where id + 3 = 8。这样会导致全表扫描计算 id 的值再进行比较,使得索引失效。

3. 索引上使用了函数也会失效

例如:select * from user where LOWER(name) like 'cong%';。这样也会导致索引失效,索引参与了函数处理,会导致去全表扫描。

4. 以%开头的Like模糊查询

如果仅仅是为有模糊匹配,索引不会失效

5. or的随意使用,必须or的两个字段,都有索引,索引才会生效

user 当前只有一个索引 name 。此时执行以下SQL :select * from user where name= 'cong' or age = 18; 这也会导致索引失效,因为 age 没有索引。

6. 隐式类型转换,会导致索引失效

例如:字符串不加' ',隐式的类型转换会导致索引失效

不小心将 varchar 类型的 name 条件匹配了 int 类型字段。

SQL 是这样的 select * from user where name = 1;

正确的应该写为select * from user where name = '1';

7.表中两个不同的字段进行比较,索引会失效

例如这样的SQL :select * from user where id > age; ,将 idage 字段做了比较,索引失效!

8.使用了 is not null

注意使用了 is not null 会直接导致失效,而使用 is null 则不会。因为当使用 is not null 条件时,数据库系统需要扫描整个索引,找出所有不为 null 的值,这可能会导致索引失效。使用 is null条件不会导致索引失效,因为对于索引而言,查找 null 值的行与查找其他任何特定值的行都没有本质区别。在大多数情况下,null 值都会被索引包括在内。

9.使用了 order by,但后面不跟主键

order by 后面跟的 不是主键 或者 不是覆盖索引 会导致不走索引。

10.使用了 != 、<>,可能导致索引失效

例如这样的 SQL :select * from user where name != 'cong'

如果name列的值大多数都是'cong',那么不等于'cong'的记录可能很少,优化器可能会认为使用索引不划算,因此选择全表扫描。这种情况下,索引可能不会生效。

3.SQL语句优化

  1. SELECT语句务必指明字段名称(避免直接使用select*)
  2. SQL语句要避免造成索引失效的写法(2.2 索引失效的场景
  3. 尽量用union all代替union ,union会多一次过滤,效率低

上面两个sql使用union all连接则第二个sql重复的值也会被返回,使用union会多一次过滤,过滤掉第二个sql重复的值

        4.Join优化:能用inner join就不用left join、right oin,如必须使用一定要以小表为驱动,

内连接会对两个表进行优化,优先把小表放到外边,把大表放到里边。left join 或right join,不会重新调整顺序

4.主从复制、读写分离

主从复制、读写分离(分库)解决的是访问的压力,不能解决海量数据的存储,海量数据存储需要用到分库分表

5.分库分表

当MySQL单表数据量过大,比如数据量超过1千万条或者储存量达到20G的时候,读写性能变得很差。而且常规的优化手段已经不起作用了,比如:SQL调优、添加索引、主从复制、读写分离。这时候就需要用到MySQL终极优化方案 — 分库分表

5.1.怎么判断项目是需要分库还是要分表?

(分库解决的是访问的压力,分表解决的是海量数据存储)

1.当单表数据量过大,读写性能较差,就需要分表。

2.当数据库的QPS过高,数据库连接数不足的时候,就需要分库。

3.当两者都有的时候,就需要分库分表。

5.2 分库分表有哪些拆分方案?

分库分表有垂直拆分和水平拆分。垂直拆分又有垂直分库、垂直分表。

5.2.1 垂直分库

垂直分库,不同的业务拆分到不同的数据库。

5.2.2 垂直分表

垂直分表,把长度较大或者访问频次较低的字段,拆分到扩展表中。

5.2.3 水平分库

水平分库是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器上。

5.2.4 水平分表

5.3 分库分表带来的问题

更详细的可以看这篇文章第四条

Mysql分库分表 面试题(待补充完善)_mysql分库分表面试题-CSDN博客

6.面试回答

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

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

相关文章

【VMware】使用笔记

一、安装 win11支持16.2以上版本&#xff0c;其他版本不兼容 安装参考&#xff1a; 二、设置 1、蓝屏设置 参考&#xff1a;win11打开VMware虚拟机蓝屏解决_win11vmware蓝屏-CSDN博客 2、VMwareTool配置 第一步&#xff1a;移除“open-vm-tools” sudo apt-get autoremo…

css边框修饰

一、设置线条样式 通过 border-style 属性设置&#xff0c;可选择的一些属性如下&#xff1a; dotted&#xff1a;点线 dashed&#xff1a;虚线 solid&#xff1a;实线 double&#xff1a;双实线 效果如下&#xff1a; 二、设置边框线宽度 ① 通过 border-width 整体设置…

OpenGL入门002——顶点着色器和片段着色器

文章目录 一些概念坐标转换阶段顶点着色器片段着色器VBOVAO 实战简介main.cppCMakeLists.txt最终效果 一些概念 坐标转换阶段 概述&#xff1a; 模型空间、世界空间、视图空间和裁剪空间是对象在3D场景中经历的不同坐标变换阶段。每个空间对应渲染管道的一个步骤&#xff0c;…

LeetCode 684.冗余连接:拓扑排序+哈希表(O(n)) 或 并查集(O(nlog n)-O(nα(n)))

【LetMeFly】684.冗余连接&#xff1a;拓扑排序哈希表&#xff08;O(n)&#xff09; 或 并查集&#xff08;O(nlog n)-O(nα(n))&#xff09; 力扣题目链接&#xff1a;https://leetcode.cn/problems/redundant-connection/ 树可以看成是一个连通且 无环 的 无向 图。 给定往…

C语言指针与一维数组 Java动态初始化与常见问题(越界问题)

1./*int main(void) { int a[5] { 10,20,30,40,50 };//数组间的元素地址相连的 int* p; printf("a代表的地址&#xff1a;%d\n", a);//数组首个元素的地址 printf("a1代表的地址&#xff1a;%d\n", a 1);//偏移数组 printf("a2…

2023年SEO趋势分析与未来发展展望

内容概要 在2023年的数字营销环境中&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;依然扮演着关键角色。随着技术的不断演进和用户需求的变化&#xff0c;SEO趋势也在不断变化。首先&#xff0c;核心算法的更新已开始影响网站排名&#xff0c;搜索引擎越来越注重网站内…

面试经典 150 题:189、383

189. 轮转数组 【参考代码】 class Solution { public:void rotate(vector<int>& nums, int k) {int size nums.size();if(1 size){return;}vector<int> temp(size);//k k % size;for(int i0; i<size; i){temp[(i k) % size] nums[i];}nums temp; }…

Linux云计算 |【第五阶段】CLOUD-DAY8

主要内容&#xff1a; 掌握DaemonSet控制器、污点策略&#xff08;NoSchedule、Noexecute&#xff09;、Job / CronJob资源对象、掌握Service服务、服务名解析CluterIP&#xff08;服务名自动发现&#xff09;、&#xff08;Nodeport、Headless&#xff09;、Ingress控制器 一…

智能网联汽车:人工智能与汽车行业的深度融合

内容概要 在这个快速发展的时代&#xff0c;智能网联汽车已经不再是科幻电影的专利&#xff0c;它正在悄然走进我们的日常生活。如今&#xff0c;人工智能&#xff08;AI&#xff09;技术与汽车行业的结合犹如一场科技盛宴&#xff0c;让我们看到了未来出行的新方向。通过自动…

Iceoryx2:高性能进程间通信框架(中间件)

文章目录 0. 引言1. 主要改进2. Iceoryx2 的架构3. C示例代码3.1 发布者示例&#xff08;publisher.cpp&#xff09;3.2 订阅者示例&#xff08;subscriber.cpp&#xff09; 4. 机制比较5. 架构比较6. Iceoryx vs Iceoryx2参考资料 0. 引言 Iceoryx2 是一个基于 Rust 实现的开…

NumPy安装

1.NumPy简介 NumPy(Numerical Python) 是 Python 语言的扩展程序库&#xff0c;支持大量维度数组与矩阵运算&#xff0c;此外也针对数组运算提供大量的数学函数库。 NumPy 的前身 Numeric 最早由 Jim Hugunin 与其它协作者共同开发&#xff0c;2005 年&#xff0c;Travis Oliph…

全自动一键批量创建站群网站插件 | Z-BlogPHP 堆词起站工具

在当今竞争激烈的数字营销世界&#xff0c;如何快速提升网站曝光率和流量&#xff1f;答案就是智能站群系统。 本文将结合实际效果&#xff0c;介绍一款功能强大的站群系统&#xff0c;重点讲述其堆词功能、泛目录管理、一键批量创建、内容转码、自定义标签和GPT内容生成与发布…

C++研发笔记11——C语言程序设计初阶学习笔记9

本篇笔记我们继续第二部分《初识C语言》的学习&#xff0c;上一篇学习笔记当中我们详细学习了常见关键字以及#define 定义常量和宏的相关知识&#xff0c;接下来第二部分的内容的内容还包括&#xff1a;指针以及结构体。 第二部分 初识C语言 十三、指针 // 学习指针之前&am…

Apache HTTP Sever 的初级操作指南

Apache 初级操作指南 摘要&#xff1a; 本文详细介绍了 Apache HTTP Server 的初级操作方法&#xff0c;包括安装与配置、启动与停止服务、虚拟主机设置以及访问日志与错误日志的查看与分析等内容。通过本文的学习&#xff0c;初学者可以快速掌握 Apache 的基本操作&#xff0…

[数组排序] LCR 164. 破解闯关密码

文章目录 1. 题目链接2. 题目大意3. 示例4. 解题思路5. 参考代码 1. 题目链接 LCR 164. 破解闯关密码 - 力扣&#xff08;LeetCode&#xff09; 2. 题目大意 描述&#xff1a;给定一个非负整数数组 nums。 要求&#xff1a;将数组中的数字拼接起来排成一个数&#xff0c;打印…

【深度学习】时间序列预测、分类、异常检测、概率预测项目实战案例

说明&#xff1a;本专栏内容来自于个人学习笔记、以及相关项目的实践与总结。写作目的是为了让读者体会深度学习的独特魅力与无限潜力&#xff0c;以及在各行各业之中的应用与实践。因作者时间精力有限&#xff0c;难免有疏漏之处&#xff0c;期待与读者共同进步。 前言 在当今…

C++学习笔记----10、模块、头文件及各种主题(一)---- 模块(1)

在使用模块之前&#xff0c;头文件用于提供代码重用的接口。头文件确实有许多问题&#xff0c;比如避免同一头文件的多重包含以及确保头文件的包含顺序正确。还有&#xff0c;简单的#include&#xff0c;例如&#xff0c;<iostream>就添加了几千行代码&#xff0c;编译器…

第十五章 Vue工程化开发及Vue CLI脚手架

目录 一、引言 二、Vue CLI 基本介绍 三、安装Vue CLI 3.1. 安装npm和yarn 3.2. 安装Vue CLI 3.3. 查看 Vue 版本 四、创建启动工程 4.1. 创建项目架子 4.2. 启动工程 五、脚手架目录文件介绍 六、核心文件讲解 6.1. index.html 6.2. main.js 6.3. App.vue 一、…

EtherCAT通信系统中的时钟同步机制

EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;通信系统中的时钟同步机制是其核心特性之一&#xff0c;它确保了所有连接的设备能够精确、同步地执行操作。以下是对EtherCAT通信系统中时钟同步机制的详细解释和介绍&#xff1a; 一、分布式时钟…

Linux 进程终止 进程等待

目录 进程终止 退出码 错误码 代码异常终止(信号详解) exit _exit 进程等待 概念 等待的原因 wait 函数原型 参数 返回值 监控脚本 waitpid 概念 函数原型 参数 返回值 WIFEXITED(status) WEXITSTATUS(status) 问题 为什么不用全局变量获得子进程的退出信…