首页 > 数据库 >mysql面试题

mysql面试题

时间:2024-05-08 18:57:36浏览次数:27  
标签:左表中 面试题 JOIN 事务 查询 索引 mysql 右表中

索引失效
1.模糊查询
2.使用函数和计算:
3.不匹配的数据类型:
4.使用OR条件的不同索引列:
5.复合索引的最左前缀原则:
6.索引列在条件中使用负向查询:
如NOT IN、NOT EXISTS、NOT LIKE等负向查询条件可能会导致索引失效。
7.索引列在条件中使用NULL:
当索引列中包含NULL值,并且在查询条件中使用IS NULL或IS NOT NULL时,索引可能会失效。

mysql优化
1.根据三范式建表,为了查询方便适当冗余。
2.索引优化 wehere order列创建索引。
3.尽量使用覆盖索引,SELECT语句中尽量不要使用
覆盖索引是一种非常强大的工具,能大大提高查询性能,只需要读取索引而不需要读取数据
4.order by、group by语句要尽量使用到索引。
5.索引长度尽量短,短索引可以节省索引空间,使查找的速度得到提升。
6.JOIN两张表的关联字段最好都建立索引,而且最好字段类型是一样的。
7.WHERE条件中尽量不要使用not in语句(建议使用not exists)
8.合理利用慢查询日志、explain执行计划查询。
9.LIMIT优化如果预计SELECT语句的查询结果是一条,最好使用 LIMIT 1,可以停止全表扫描。
10.小表驱动大表,建议使用left join时,以小表关联大表
11.避免全表扫描,mysql在使用不等于(!=或者<>)的时候无法使用索引导致全表扫描

MVCC
多版本的并发控制,英文全称:Multi Version Concurrency Control,并发访问控制的并发控制技术。
核心理念就是数据快照,不同的事务访问不同版本的数据快照,从而实现不同的事务隔离级别。

MVCC 在mysql 中的实现依赖的是undo log与read view 。InnoDB通过事务的undo日志巧妙地实现了多版本的数据快照。
InnoDB的MVCC是通过在每行记录后面保存两个隐藏的列来实现的。这两个列,一个保存了行的事务 ID,一个保存了行的回滚指针。
根据行为的不同,undo log分为两种: insert undo log 和 update undo log.

好处:读不加锁,读写不冲突

防止幻读:加锁案例案例
开始事务:
事务T1开始,并设置隔离级别为可重复读。
查询账户余额:
事务T1执行一个查询,获取所有账户的余额信息。
为了防止幻读,事务T1在查询时获取一个范围锁(例如,在SQL中使用SELECT ... FOR UPDATE),这样其他事务就无法在这个范围内插入新的记录。
计算新的余额:
事务T1根据某些业务逻辑计算账户的新余额。
更新账户余额:
事务T1更新账户余额。
由于范围锁的存在,其他尝试插入新账户记录的事务(如事务T2)将会被阻塞,直到事务T1完成。
提交事务:
事务T1提交,释放所有的锁。
此时,其他被阻塞的事务(如事务T2)可以继续执行。
通过使用范围锁,我们确保了在事务T1执行期间,不会有新的账户记录被插入,从而控制了幻读的发生。
这种锁机制确保了事务T1在查询和更新操作之间看到的数据是一致的。

需要注意的是,使用锁来控制幻读可能会影响系统的并发性能,因为锁可能会导致其他事务等待。
因此,在设计锁策略时,需要权衡系统的并发性和数据的一致性需求。此外,锁的使用应该遵循最小锁原则,即只锁定必要的资源,以减少对系统并发性能的影响。

存储引擎 主要InnoDB
InnoDB 支持事务和行级锁定 *.frm 表定义文件 *.ibd 数据文件和索引文件
MyISAM 高速引擎,拥有较高的插入,查询速度,但不支持事务
Memory 内存存储引擎,拥有极高的插入,更新和查询效率,只在内存上保存数据
Falcon
Archive
CSV

show engines; -- 查看存储引擎
InnoDB的主要的磁盘文件主要分为三  大块:一是系统表空间,二是用户表空间,三是redo日志文件和归档文件

数据结构
二叉树 ->平衡二叉树 -> b树多路平衡查找树 -> b+树
B树:非叶子节点和叶子节点都会存储数据。
B+树:只有叶子节点才会存储数据,非叶子节点至存储键值。叶子节点之间使用双向指针连接,每个节点都会记住头尾的指针,方便修改,新增,删除;
最底层的叶子节点形成了一个双向有序链表


聚簇索引
辅助索引
主键索引
组合索引
覆盖索引
	直接在辅助索引树上全部获取,也就是说索引树已经“覆盖”了我们的查询需
	求,这时MySQL就不会白费力气的回表查询,这中现象就是覆盖索引
	使用覆盖索引可以减少了磁盘IO次数,显著 提升查询性能

MySQL锁
粒度
全局锁 flush tables with read lock; unlock tables;
表级锁 lock table aa read(write),bb read(write),其他
行级锁
功能
共享锁 Shared Locks(S锁)
排他锁 Exclusive Locks(X锁)

意向锁	主要作用是为了【全表更新数据】时的性能提升。否则在全表更新数据时,需要先检索该范是否某些记录上面有行锁。
记录锁(Record Locks) 记录锁, 仅仅锁住索引记录的一行,在单条索引记录上加锁
间隙锁(Gap Locks)
临键锁(Next-Key Locks)

INNER JOIN返回两个表中都有匹配的行。
如果左表中的行在右表中没有匹配,或者右表中的行在左表中没有匹配,这些行不会出现在结果集中。
它是默认的JOIN类型,如果没有指定,则通常执行INNER JOIN。

LEFT JOIN返回左表中的所有行,即使右表中没有匹配。
如果左表中的行在右表中没有匹配,那么这些行仍然会出现在结果集中,右表的相关列将包含NULL值。
LEFT JOIN可以用来查找左表中有但右表中没有的记录。

RIGHT JOIN返回右表中的所有行,即使左表中没有匹配。
如果右表中的行在左表中没有匹配,那么这些行仍然会出现在结果集中,左表的相关列将包含NULL值。
RIGHT JOIN可以用来查找右表中有但左表中没有的记录。

FULL JOIN返回左表和右表中的所有行。
如果左表中的行在右表中没有匹配,或者右表中的行在左表中没有匹配,这些行仍然会出现在结果集中,不匹配的一侧将包含NULL值。
FULL JOIN可以用来查找两个表中所有的记录,无论它们是否在另一表中找到匹配。

标签:左表中,面试题,JOIN,事务,查询,索引,mysql,右表中
From: https://www.cnblogs.com/juner-1050/p/18180646

相关文章

  • Mysql中的双路排序和单路排序
    在Mysql中使用orderby进行排序的时候,是可以使用到索引排序的,但是需要添加一些限制条件,例如:select*fromt_userwherename='张三'orderbyname;使用这种方式就可以使用到索引,同时使用limit也是可以使用到索引的select*fromt_userorderbyname;通过这种方式不会使用到索......
  • 你知道什么是 MySQL Online DDL 吗?
    前言MySQL在进行DDL操作时,可能会产生表锁导致阻塞,影响用户的DML操作,而OnlineDDL指的是在DDL期间,允许用户进行DML操作。本文将详细讲解MySQL各版本的OnlineDDL。关于什么是DDL和DML操作,详细介绍见MySQL操作命令总结。1.什么是OnlineDDLOnlineDDL功......
  • MySQL配置文件
    一.Linux1.MySQL5.7**MySQL5.7配置文件示例(适用于Linux)**[mysql]#设置mysql客户端默认字符集default-character-set=utf8[mysqld]#服务器端口port=3306#MySQL的安装目录basedir=/usr/local/mysql#MySQL的数据目录datadir=/var/lib/mysql#错误日志文件......
  • MySQL-安装脚本参考
    #!/bin/bash#安装MySQL程序install_mysql(){#mv/etc/yum.repos.d/*/tmp/#curl-o/etc/yum.repos.d/CentOS-Base.repohttps://mirrors.aliyun.com/repo/Centos-7.repo#wget-O/etc/yum.repos.d/epel.repohttp://mirrors.aliyun.com/repo/epel-7.repo#yuminstall-y......
  • 【container】【docker-compose】【mysql】【redis】【rabbit mq】【mongo】【elastic
    @目录写在前面mysqlredisrabbitmqmongoelasticsearch单节点多节点参考资料dockerkuberneteshelmk3s写在前面相关博文个人博客首页免责声明:仅供学习交流使用!开源框架可能存在的风险和相关后果将完全由用户自行承担,本人不承担任何法律责任。mysqlversion:'3'services:......
  • mysql约束
    1.概述概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。目的:保证数据库中数据的正确、有效性和完整性。分类: 注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。2.约束演示案例需求:根据需求,完成表结构的创建。需求如下: 对应的建表语......
  • mysql函数
    1.字符串函数 MySQL中内置了很多字符串函数,常用的几个如下: 演示:concat:字符串拼接selectconcat('Hello','MySQL');lower:全部转小写selectlower('Hello');upper:全部转大写selectupper('Hello');lpad:左填充selectlpad('01',......
  • mysql8 根据ibd文件恢复表
    原文https://github.com/ddcw/ibd2sql 环境:mysql8.0.33一、创建测试数据Mysql8.0.32环境:mysql>createtablet1(idint,namevarchar(200));QueryOK,0rowsaffected(0.02sec)mysql>insertintot1select1,'a';QueryOK,1rowaffected(0.01sec)......
  • MySQL索引数据结构
    什么是索引索引在项目中还是比较常见的,它是帮助MySOL高效获取数据的数据结构,主要是用来提高数据检索的效率,降低数据库的IO成本,同时通过索引列对数据进行排序,降低数据排序的成本,也能降低了CPU的消耗。索引的底层数据结构MySQL的默认的存储引擎InnoDB采用的B+树的数据结构来存储......
  • mysql基本语法
    1.DDLDataDefinitionLanguage,数据定义语言,用来定义数据库对象(数据库,表,字段)。 1.1数据库操作查询所有数据库showdatabases;查询当前数据库selectdatabase();创建数据库createdatabase[ifnotexists]数据库名[defaultcharset字符集][col......