MySQL篇

简介: MySQL查询语句书写顺序为:SELECT、FROM、JOIN、WHERE、GROUP BY、HAVING、ORDER BY、LIMIT;实际执行顺序则不同,从FROM开始,最后执行SELECT和LIMIT。多表查询主要通过内连接(显式/隐式)和外连接(左、右)实现。内连接仅返回匹配行,外连接保留驱动表全部记录。CHAR固定长度,VARCHAR可变长度;索引类型包括单列、组合及全文索引,底层多用B+树结构。InnoDB使用聚簇索引,数据存于主键索引叶节点;MyISAM为非聚簇索引,叶节点存指针。查询非主键索引需回表二次查找,覆盖索引可避免回表提升性能。

Mysql查询语句的书写顺序
Select [distinct ] <字段名称> from 表1 [ join 表2 on ] where group by <字段>
having order by <排序字段> limit <起始偏移量,行数>

  1. Mysql查询语句的执行顺序
    (8)Select(9)distinct 字段名1,字段名2,(7)[fun(字段名)](1)from 表1(3)join 表2 (2)on (4)where (5)group by <字段> (6)having (10)order by <排序字段> (11)limit <起始偏移量,行数>
  2. Mysql 如何实现多表查询
    MYSQL多表查询主要使用连接查询 , 连接查询的方式主要有 :
    ● 内连接
    ○ 隐式内连接 : Select 字段 From 表A , 表B where 连接条件
    ○ 显式内连接 : Select 字段 From 表A inner join 表B on 连接条件
    ● 外连接
    ○ 左外连接 : Select 字段 From 表A left join 表B on 连接条件
    ○ 右外连接 : Select 字段 From 表A right join 表B on 连接条件
    ○ 全外连接:(很少用)
    ● 交叉连接 : (很少用)
  3. MYSQL内连接和外连接的区别 ?
    ● 内连接:只有两个元素表相匹配的才能在结果集中显示。
    ● 外连接:左外连接: 左边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
    ● 右外连接:右边为驱动表,驱动表的数据全部显示,匹配表的不匹配的不会显示。
    ● 全外连接:连接的表中不匹配的数据全部会显示出来。
    ● 交叉连接:笛卡尔效应,显示的结果是链接表数的乘积。
  4. CHAR和VARCHAR的区别?
  5. char的长度是不可变的,用空格填充到指定长度大小,而varchar的长度是可变的。
  6. char的存取速度比varchar要快得多
  7. char的存储方式是:对英文字符(ASCII)占用1个字节,对一个汉字占用两个字节。varchar的存储方式是:对每个英文字符占用2个字节,汉字也占用2个字节。
  8. 了解过Mysql的索引嘛 ?
    MYSQL索引主要有 : 单列索引 , 组合索引和空间索引 , 用的比较多的就是单列索引和组合索引 , 空间索引我这边没有用到过
    单列索引 : 在MYSQL数据库表的某一列上面创建的索引叫单列索引 , 单列索引又分为
    ● 普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。
    ● 唯一索引:索引列中的值必须是唯一的,但是允许为空值
    ● 主键索引:是一种特殊的唯一索引,不允许有空值
    ● 全文索引: 只有在MyISAM引擎、InnoDB(5.6以后)上才能使⽤用,而且只能在CHAR,VARCHAR,TEXT类型字段上使⽤用全⽂文索引。
    组合索引 : 在MYSQL数据库表的多个字段组合上创建的索引 , 称为组合索引也叫联合索引
    ● 组合索引的使用,需要遵循左前缀原则
    ● 一般情况下,建议使用组合索引代替单列索引(主键索引除外)
  9. 索引的底层数据结构了解过嘛 ?
    索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
    MyISAM和InnoDB存储引擎:只⽀支持B+ TREE索引, 也就是说默认使用BTREE,不能够更换
    MEMORY/HEAP存储引擎:支持HASH和BTREE索引
  10. MYSQL支持的存储引擎有哪些, 有什么区别 ?
    MYSQL存储引擎有很多, 常用的就二种 : MyISAM和InnoDB , 者两种存储引擎的区别 ;
    ● MyISAM支持256TB的数据存储 , InnoDB 只支持64TB的数据存储
    ● MyISAM 不支持事务 , InnoDB 支持事务
    ● MyISAM 不支持外键 , InnoDB 支持外键
  11. 什么是聚簇索引什么是非聚簇索引 ?
    聚簇索引
    在使用InnoDB存储引擎的时候, 主键索引B+树叶子节点会存储数据行记录,简单来说数据和索引在一起存储 , 这就是聚簇索引
    非聚簇索引
    在使用MyISAM存储引擎的时候, B+树叶子节点只会存储数据行的指针,简单来说数据和索引不在一起 , 这就是非聚簇索引
  12. 在一个非主键字段上创建了索引, 想要根据该字段查询到数据, 需要查询几次 ?
    需要查询二次
    如果使用MyISAM存储引擎 , 会首先根据索引查询到数据行指针, 再根据指针获取数据
    如果是InnoDB存储引擎 , 会根据索引查找指定数据关联的主键ID , 再根据主键ID去主键索引中查找数据
  13. 知道什么是回表查询嘛 ?
    当我们为一张表的name字段建立了索引 , 执行如下查询语句 :
    select name,age from user where name='Alice'
    那么获取到数据的过程为 :
  14. 根据name='Alice'查找索引树 , 定位到匹配数据的主键值为id=18
  15. 根据id=18到主索引获取数据记录 (回表查询)
    先定位主键值,再定位行记录就是所谓的回表查询,它的性能较扫一遍索引树低
  16. 知道什么叫覆盖索引嘛 ?
    覆盖索引是指只需要在一棵索引树上就能获取SQL所需的所有列数据 , 因为无需回表查询效率更高
    实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。
    执行如下查询语句 : select name,age from user where name='Alice'
    因为要查询 name和 age二个字段 , 那么我们可以建立组合索引
    create index index_name_age on user(name,age)
    那么索引存储结构如下 :
    这种情况下, 执行select name,age from user where name='Alice' , 会先根据name='Alice', 找到记录 , 这条记录的索引上刚好又包含了 age 数据 , 直接把 Alice 77数据返回 , 就不会执行回表查询 , 这就是覆盖索引
  17. 知道什么是左前缀原则嘛 ?
    在mysql建立联合索引时会遵循左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到 ;
    例如 : create index index_age_name_sex on tb_user(age,name,sex);
    上述SQL语句对 age,name和sex建一个组合索引index_age_name_sex,实际上这条语句相当于建立了(age) , (age,name) , (age,name,sex)三个索引 .
    select * from tb_user where age = 49 ; -- 使用索引

select * from tb_user where age = 49 and name = 'Alice' ; -- 使用索引

select * from tb_user where age = 49 and name = 'Alice' and sex = 'man'; -- 使用索引

select * from tb_user where age = 49 and sex = 'man'; -- 使用索引 , 但是只有 age 匹配索引 sex没有走索引

select * from tb_user where name = 'Alice' and age = 49 and sex = 'man' ; -- 使用索引 , 因为MySQL的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引

select * from tb_user where name = 'Alice' and sex = 'man' ; -- 不会使用索引

  1. 什么情况下索引会失效 ?
    MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,编写合理化的SQL能够提高SQL的执行效率
  2. 不要在列上使用函数和进行运算
  3. 不要在列上使用函数,这将导致索引失效而进行全表扫描。
  4. 尽量避免使用 != 或 not in或 <> 等否定操作符
  5. 尽量避免使用 or 来连接条件
  6. 多个单列索引并不是最佳选择,建立组合索引代替多个单列索引, 可以避免回表查询
  7. 查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找
  8. 索引不会包含有NULL值的列
  9. 当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
  10. like 语句的索引失效问题like 的方式进行查询,在 like “value%” 可以使用索引,但是对于 like “%value%” 这样的方式,执行全表查询
  11. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?
    需要创建索引情况
  12. 主键自动建立主键索引
  13. 频繁作为查询条件的字段应该创建索引
  14. 多表关联查询中,关联字段应该创建索引 (on 两边都要创建索引)
  15. 查询中排序的字段,应该创建索引
  16. 频繁查找字段 , 应该创建索引
  17. 查询中统计或者分组字段,应该创建索引
    不要创建索引情况
  18. 表记录太少
  19. 经常进⾏行行增删改操作的表
  20. 频繁更新的字段
  21. where条件里使用频率不高的字段
  22. mysql的性能优化
  23. 从设计方面 选择合适的存储引擎 , 合适的字段类型 , 遵循范式(反范式设计)
    a. 存储引擎 : 不需要事务, 不需要外键读写较多的的使用MyIsam需要事务, 需要外键的使用InnoDB
    b. 合适的字段类型 , 例如 : 定长字符串用char , 不定长用varchr状态, 性别等有限数量值的用tinyint
    c. 遵循范式 :第一范式1NF,原子性第二范式2NF,消除部分依赖第三范式3NF,消除传递依赖
    2.从功能方面可以对索引优化,采用缓存缓解数据库压力,分库分表。
    3.从架构方面可以采用主从复制,读写分离,负载均衡
  24. MYSQL超大分页怎么处理 ?
    MYSQL 不是跳过offset行, 而是取offset+N行, 然后放弃前offset行 , 返回N行, 所以当offset比较法的情况下分页效率很低
    正确的处理方法是 : 先快速定位需要获取的id再关联查询获取数据
  25. 如何定位慢查询 ?
    可以在MYSQL配置文件中开启慢查询 , 有两种方式可以开启慢查询
    方式一 : 修改my.ini配置文件 , 重启 MySQL 生效
    [mysqld]
    log_output='FILE,TABLE'
    slow_query_log='ON'
    long_query_time=0.001
    方式二 : 设置全局变量
    SET GLOBAL slow_query_log = 'ON';
    SET GLOBAL log_output = 'FILE,TABLE';
    SET GLOBAL long_query_time = 0.001;
  26. 一个SQL语句执行很慢, 如何分析
    首先可以开启慢查询, 通过慢查询日志或者命令, 获取到执行慢的SQL语句 , 其次可以使用EXLPAIN命令分析SQL语句的执行过程
    EXLPAIN命令, 比较重要的字段(加黑加粗的是重要的) :

select_type重点解读
type重点解读:查询性能从上到下依次是最好到最差
extra重点解读

  1. Mysql锁和分库分表
    有精力看看下发的资料和文档, 没精力直接说没搞过
相关文章
|
1天前
|
jenkins 持续交付 调度
项目《神领物流》
本项目为自研物流系统,基于微服务架构实现智能调度与管控,涵盖用户、快递员、司机多端应用。采用GitFlow管理代码,通过Jenkins实现持续集成,提交后自动构建,保障开发效率与系统稳定,类似顺丰速运模式,面向C端提供高效快递服务。(239字)
|
1天前
|
缓存 数据建模 文件存储
EFC&CTO:缓存引发数据不一致问题排查与深度解析
EFC是NAS自研分布式文件系统客户端,近期升级支持多客户端分布式缓存,兼容NAS、CPFS、OSS。因未适配CTO测试,发版时出现data mismatch。排查发现非单纯缓存读旧数据问题,通过NFS挂载验证确认文件系统数据被破坏,挑战超出预期。
|
1天前
|
设计模式 Java 程序员
推荐书籍
推荐多本Java经典书籍:《Head First Java》适合入门,《Java核心技术》深入巩固基础,《Java编程思想》整合设计模式,适合进阶。并发方面有《Java并发编程之美》等,JVM推荐《深入理解Java虚拟机》与《实战JVM》。体系全面,适合不同阶段学习。
|
1天前
|
负载均衡 算法 Java
微服务篇
SpringBoot核心原理是自动装配,通过@SpringBootApplication注解实现配置类、组件扫描与自动配置。其启动流程包括环境初始化、上下文创建与自动化配置。常用起步依赖如web、redis等;支持properties、YAML等配置文件,后加载的覆盖先加载的。项目通过Feign、Ribbon实现服务通信与负载均衡,使用Nacos做注册与配置中心,Sentinel或Hystrix实现限流熔断,Gateway实现网关限流与CORS跨域控制,结合Spring Cloud五大组件构建微服务架构。
|
1天前
|
消息中间件 存储 缓存
MQ篇
本项目采用RabbitMQ、Kafka和EMQ实现异步通信与数据采集。RabbitMQ用于服务解耦、流量削峰,支持多种消息模式与高可用集群;Kafka处理高吞吐用户行为数据,保障实时推荐与数据同步;EMQ基于MQTT协议实现物联网设备与服务器间可靠通信,支持QoS分级与延迟发布,确保消息不丢不重。三者协同提升系统性能与稳定性。
|
1天前
|
Arthas 监控 Java
jvm相关
本节介绍Arthas常用命令:实时监控系统数据(dashboard)、查看JVM线程、内存、系统属性(sysprop)、环境变量(sysenv)、性能计数器(perfcounter)、日志配置(logger)及静态属性(getstatic)等,支持动态修改与诊断,助力Java应用排查问题。
|
1天前
|
运维 NoSQL 测试技术
Redis:内存陡增100%深度复盘
事故源于大KEY在业务高峰时占满带宽,导致Redis内存使用率骤升至100%。虽有淘汰策略,但缓冲区(输入/输出)激增吞噬内存,主线程阻塞,命令无法处理,最终引发GET/SET超时崩溃。根本原因为大KEY与高流量叠加,触发缓冲区溢出,超出实例承载极限。
|
1天前
|
fastjson Java Kotlin
FastJson:大面积故障规避案例
不到两年开发中,已三次踩坑FastJson,版本差异大,使用需谨慎。项目为Kotlin/Java/Groovy混编:Java生态完善;Kotlin语法简洁、支持协程,但工具链兼容差;Groovy用得少,依赖模型辅助。曾因反序列化异常致预发大量报错,排查发现为FastJson隐患所致,影响广泛,令人后怕。
|
1天前
|
Ubuntu Java Linux
Docker
本文介绍Docker基础操作,涵盖镜像打包、容器管理及Dockerfile编写。通过示例演示如何基于Ubuntu镜像构建Java运行环境,打包Spring Boot应用(linuxDemo.jar),并实现容器化部署与端口映射,最终验证服务运行状态,适合初学者快速掌握Docker核心技能。(239字)
|
1天前
|
缓存 开发工具 git
QLExpress使用及源码分析
QLExpress是阿里开源的轻量级规则引擎,支持通过注解与YAML配置实现业务逻辑与代码解耦。结合实体别名、接口规则定义及脚本化表达式,实现动态计算与判断,如用户年龄判断、BMI计算等。支持AST语法树解析与上下文绑定,提供灵活的二次扩展能力,适用于复杂业务场景的延迟执行与缓存优化。