首页 > 数据库 >MySQL面试问题(二)

MySQL面试问题(二)

时间:2024-08-22 22:50:56浏览次数:15  
标签:索引 优化 聚簇 问题 面试 MySQL 数据 主键

MySQL面试问题(二)

文章目录

为什么要使用索引

  1. 索引减少了存储引擎需要扫描的数据量。
  2. 帮助我们进行排序,避免使用临时表。
  3. 索引可以将随机IO转换为顺序IO。

索引是不是越多越好

  1. 索引越多,更新的速度越慢。索引会增加数据库写入操作的成本,innodb使用插入缓存,把多次插入合并成一次插入进行优化。
  2. 太多的索引会影响mysql查询优化器的选择时间。
  3. 更多的索引需要更多的空间。

MySQL索引机制

  1. 索引本质上是一个优化查询的数据结构比如B+树,可以优化查询效率。索引一般以文件的形式存储在磁盘上,索引检索需要磁盘IO操作,评价一个数据结构作为索引的优劣重要的指标就是在查找过程中磁盘IO操作次数的渐进复杂度。当数据存储在磁盘类存储介质上时,它是作为数据块存放。这些数据块被当做一个整体来访问,可以保证操作的原子性。磁盘数据块类似于链表结构,包含数据部分和指向下一个节点的指针,不需要连续存储,所以没有索引则检索过程变成了顺序查找。

什么是聚簇索引

  1. 聚簇索引是按照表的主键构造一棵B+树,同时叶子节点存放的就是行记录数据,聚簇索引的叶子节点也称为数据页。这个特性决定了索引组织表中数据也是索引的一部分。
  2. 由于聚簇索引的索引页面指向数据页面,所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。
  3. 每张表只能建一个聚簇索引,并且建聚簇索引需要相当于该表120%的附加空间来存储该表的副本和索引中间页。

没有主键innodb如何处理

  1. MySQL的innodb引擎本身存储的形式必须是聚簇索引的形式,在磁盘上树状存储,但是不一定是根据主键聚簇。如果有主键,主键就是聚簇索引。没有主键的情况下,第一个非空的唯一索引就是聚簇索引。如果都没有,那么就是有一个隐藏的rowid即行ID作为聚簇索引。

联合索引

  1. 联合索引的选择原则是最左匹配原则、离散度高原则、最少空间原则。最左匹配原则,经常用的列优先。离散度高原则,选择离散度高的列优先,列的离散性越高,选择性越好。最少空间原则,宽度小的列优先。

  2. 联合索引的作用有减少开销、覆盖索引和效率高。建一个联合索引,相当于建立了多个索引,每多一个索引都会增加写操作和磁盘空间的开销,对于大数据量的表,使用联合索引会大大减少开销。使用联合索引,可以利用索引覆盖,无需回表,减少随机IO操作。索引列越多,通过索引筛选出的数据越少,效率越高。

批量向MySQL中导入1000w数据如何优化

  1. 批量录入数据,手动开启事务、手动提交。
  2. 批量SQL
insert into tab_name() values();
-- 多条数据录入,带有缓存,单条SQL不要录入过多的数据,通常不超过10M
insert into tab_name() values(),();
  1. 数据库配置

    配置SQL批处理缓存、IO缓存、是否记录binlong。

  2. 通过csv或者txt文件做本地导入,mysql import xxx文件。

  3. 代码及开发,batch批处理,多次访问数据库,批量写入。

  4. 索引会降低写效率。建表时,先不创建索引,当数据相对趋于稳定或正式发布时创建索引,先内存维护索引,索引内存空间不足,需要持久化到磁盘。

分页时偏移量很大效率很差如何优化

  1. MySQL分页时,并不直接查rows的数据,而是把offset和rows的数据全部都查出来,然后再将offset的数据扔掉,返回rows的数据。查询所有列导致回表,limit a, b会查询前a*b+b条数据,然后丢弃前a*b条记录。
  2. 可以使用覆盖索引和条件过滤的方式进行优化。

大数据量高并发访问数据库优化方法

  1. 数据库结构设计优化,比如优化数据模型,增加冗余减少数据库访问次数,优化查询SQL键索引等,增加批量查询。
  2. 分布式部署,增加主从配置,实现读写分离。
  3. 数据库分库分表、分区。
  4. 使用缓存和nosql,实现冷热数据分离。
  5. 更新存储介质,使用固态硬盘。

标签:索引,优化,聚簇,问题,面试,MySQL,数据,主键
From: https://blog.csdn.net/dolly_baby/article/details/141335799

相关文章

  • C++设计模式1:单例模式(懒汉模式和饿汉模式,以及多线程问题处理)
    饿汉单例模式        程序还没有主动获取实例对象,该对象就产生了,也就是程序刚开始运行,这个对象就已经初始化了。 classSingleton{public: ~Singleton() { std::cout<<"~Singleton()"<<std::endl; } staticSingleton*get_instance() { return&sin......
  • 【C/C++ 软件开发模拟面试 集】cmake 相关知识点模拟面试
    摘自:https://zhuanlan.zhihu.com/p/662623216第一轮:基础知识 1.1什么是CMake? 面试官: 请问你能简单描述一下CMake是什么,以及它通常用来做什么吗? 面试者: CMake是一个跨平台的自动化构建系统,主要用来管理软件构建的过程,它使用一个名为CMakeLists.txt的配置文件来指导编......
  • c++矩阵旋转问题
    问题有一个MxN的矩阵,设计函数将其顺时针旋转90度。打印示例Originalmatrix:123456789Rotatedmatrix(90degreesclockwise):741852963代码#include<iostream>#include<vector>usingnamespacestd;voidrotateMatrix90Clockwise(constv......
  • 数据库面试总结
    pgsql数据库在大数据量的查询情况下,pgsql和mysql谁更有优势当数据量达到一定程度时(如数亿条记录以上),PostgreSQL在查询性能方面的优势可能会更加明显。这得益于其强大的查询优化器、丰富的索引类型、高效的并发处理和事务管理能力以及支持分区和并行查询等特性。pgsql的......
  • 潜行工具箱-支持拼拍拼-解决二次单号限制问题-还可店铺管理
    图片:椰子作者:yezic01在日新月异的电商浪潮中,每一位商家都在寻找那把能够开启成功之门的钥匙。面对日益严格的平台规则,尤其是二次单号限制这一难题,无数商家倍感压力。然而,科技的进步总是能为行业带来意想不到的解决方案——潜行工具箱,作为一款集创新技术与实战经验于一体的电......
  • 大厂面试官:你知道Redis如何实现分布式锁么?
    常见面试题,看完基本也没啥问题了Redis如何实现分布式锁分布式锁是用于分布式环境下并发控制的一种机制,用于控制某个资源在同一时刻只能被一个应用所使用。如下图所示:Redis本身可以被多个客户端共享访问,正好就是一个共享存储系统,可以用来保存分布式锁,而且Redis的读写......
  • [小白入门]一文掌握C/C++中数组和循环结合(堵车问题、红绿灯问题)
    1.堵车问题假如现在给定从出发地到目的地的道路条数和每条路上的车辆情况为:第一条路第二条路第三条路第四条路第五条路第六条路90705278108120且车辆数大于50为轻度拥堵;大于70为中度拥堵;大于90为重度拥堵。那么如何存储这些数据?---很显然要用数......
  • pve(‌Proxmox Virtual Environment)-GPT4回答的关于CT容器的一些问题
    文章目录前言一、pve中的ct虚拟机是干嘛用的?**CT(容器)与VM(虚拟机)的区别****在PVE中使用CT的优点**二、怎么使用呢,比如我要启动一个nginx容器?1.**创建一个LXC容器**2.**启动并进入容器**3.**在容器中安装Nginx**4.**访问Nginx**5.**管理容器**三、创建一......
  • Idea2024最新版本Mavn加载问题
    Idea2024最新版本Mavn加载问题简述由于公司项目多,各个项目不一致版本,有的jdk1.8、有jdk11,最近由于工作安排,我将从转到其它项目里面。至此开启了,我的新老项目编译不通过之路。mavenclean项目错误并将加载巨慢java.lang.OutOfMemoryError:GCoverheadlimitexceeded尝试......
  • [Mysql]执行一条语句的过程
    执行一条select语句,期间发生了什么?学习SQL的时候,大家肯定第一个先学到的就是select查询语句了,比如下面这句查询语句://在product表中,查询id=1的记录select*fromproductwhereid=1;但是有没有想过,MySQL执行一条select查询语句,在MySQL中期间发生了什么?......