1. 创建索引时需要注意什么?
    (1)非空字段:应该指定列为NOT NULL,除非你想存储NULL。在mysql中,含有空值的列很难进行查询优化,因为它们使得索引、索引的统计信息以及比较运算更加复杂。你应该用0、一个特殊的值或者一个空串代替空值;

(2)取值离散大的字段:(变量各个取值之间的差异程度)的列放到联合索引的前面,可以通过count()函数查看字段的差异值,返回值越大说明字段的唯一值越多字段的离散程度高;

(3)索引字段越小越好:数据库的数据存储以页为单位一页存储的数据越多一次IO操作获取的数据越大效率越高。

  1. 使用索引查询一定能提高查询的性能吗?为什么通常,通过索引查询数据比全表扫描要快。但是我们也必须注意到它的代价。
    (1)索引需要空间来存储,也需要定期维护, 每当有记录在表中增减或索引列被修改时,索引本身也会被修改。这意味着每条记录的INSERT,DELETE,UPDATE将为此多付出4,5 次的磁盘I/O。因为索引需要额外的存储空间和处理,那些不必要的索引反而会使查询反应时间变慢。使用索引查询不一定能提高查询性能,索引范围查询(INDEX RANGE SCAN)适用于两种情况:

(2)基于一个范围的检索,一般查询返回结果集小于表中记录数的30%

(3)基于非唯一性索引的检索

  1. 百万级别或以上的数据如何删除关于索引:由于索引需要额外的维护成本,因为索引文件是单独存在的文件,所以当我们对数据的增加,修改,删除,都会产生额外的对索引文件的操作,这些操作需要消耗额外的IO,会降低增/改/删的执行效率。所以,在我们删除数据库百万级别数据的时候,查询MySQL官方手册得知删除数据的速度和创建的索引数量是成正比的。

(1)所以我们想要删除百万数据的时候可以先删除索引(此时大概耗时三分多钟)

(2)然后删除其中无用数据(此过程需要不到两分钟)

(3)删除完成后重新创建索引(此时数据较少了)创建索引也非常快,约十分钟左右。

(4)与之前的直接删除绝对是要快速很多,更别说万一删除中断,一切删除会回滚。那更是坑了。

  1. 前缀索引语法:index(field(10)),使用字段值的前10个字符建立索引,默认是使用字段的全部内容建立索引。前提:前缀的标识度高。比如密码就适合建立前缀索引,因为密码几乎各不相同。实操的难度:在于前缀截取的长度。我们可以利用select count(*)/count(distinct left(password,prefixLen));,通过从调整prefixLen的值(从1自增)查看不同前缀长度的一个平均匹配度,接近1时就可以了(表示一个密码的前prefixLen个字符几乎能确定唯一一条记录)

  2. 什么是最左前缀原则?什么是最左匹配原则

(1)顾名思义,就是最左优先,在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

(2)最左前缀匹配原则,非常重要的原则,mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a = 1 and b = 2 and c > 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

(3)=和in可以乱序,比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

最后,小编分类整理了许多java进阶学习材料和BAT面试给热爱IT行业的你,如果需要资料的请转发此文章后再私聊小编回复【java】就能领取2019年java进阶学习资料和BAT面试题以及《Effective Java》(第3版)电子版书籍。也可以加群:712263501领取海量学习资料进行学习。

MySQL面试题 | 附答案解析(五)相关推荐

  1. MySQL面试题 | 附答案解析(十五)

    SQL优化 1. 如何定位及优化SQL语句的性能问题?创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因? 对于低性能的SQL语句的定位,最重要也是最有效的方法就是使用执行计划,My ...

  2. MySQL面试题 | 附答案解析(十六)

    接上篇!!! 2. SQL的生命周期? (1)应用服务器与数据库服务器建立一个连接 (2)数据库进程拿到请求sql (3)解析并生成执行计划,执行 (4)读取数据到内存并进行逻辑处理 (5)通过步骤一 ...

  3. MySQL面试题 | 附答案解析(二十)

    接上篇!!! 5. MySQL的复制原理以及流程 主从复制:将主数据库中的DDL和DML操作通过二进制日志(BINLOG)传输到从数据库上,然后将这些日志重新执行(重做):从而使得从数据库的数据与主数 ...

  4. MySQL面试题 | 附答案解析(十九)

    数据库优化 1. 为什么要优化 (1)系统的吞吐量瓶颈往往出现在数据库的访问速度上 (2)随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 (3)数据是存放在磁盘上的,读写速度无法和 ...

  5. MySQL面试题 | 附答案解析(十八)

    接上篇!!! SQL语句优化的一些方法 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 n ...

  6. MySQL面试题 | 附答案解析(十七)

    接上篇!!! 9. 主键使用自增ID还是UUID? 推荐使用自增ID,不要使用UUID. 因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引 ...

  7. MySQL面试题 | 附答案解析(十四)

    接上篇!!! 5. 什么是子查询 (1)QL语句的查询结果做为另一条查询语句的条件或查询结果 (2)SQL语句嵌套使用,内部的SQL查询语句称为子查询. 6. 子查询的三种情况 (1)询是单行单列的情 ...

  8. MySQL面试题 | 附答案解析(十三)

    常用SQL语句 1. SQL语句主要分为哪几类 数据定义语言DDL(Data Ddefinition Language)CREATE,DROP,ALTER 主要为以上操作 即对逻辑结构等有操作的,其中 ...

  9. MySQL面试题 | 附答案解析(十二)

    (一)存储过程与函数 什么是存储过程?有哪些优缺点? 存储过程是一个预编译的SQL语句,优点是允许模块化的设计,就是说只需要创建一次,以后在该程序中就可以调用多次.如果某次操作需要执行多次SQL,使用 ...

最新文章

  1. golang mysql 基本操作
  2. 代理服务器ip地址如何获得_详细教程:如何使用代理服务器进行网页抓取?
  3. 用C++设计一个不能被继承的类
  4. Ng第十二课:支持向量机(Support Vector Machines)(一)
  5. 信息学奥赛C++语言: 螺旋方阵1
  6. Path(1)vrep中的贝塞尔点、控制点的简单区分
  7. java百度地图坐标_java腾讯地图与百度地图坐标转换
  8. 【Unity开源项目精选】Entitas:Unity DOTS的先行者
  9. UVA-10859 - Placing Lampposts(树形DP)
  10. 【生信技能树】GEO数据库挖掘 P5
  11. 声音信号处理基频检测和时频分析
  12. Java连接SAP ————JCO 3.0技术详解
  13. 小高不太行之前端——html网页制作
  14. Unity Shader - CheckerBoard(棋盘格) 等 Pattern 的测试
  15. cbac式_CBAC
  16. Err.number错误号和错误说明
  17. Ewebeditor的问题
  18. python 地图偏移_python 地图经纬度转换、纠偏的实例代码
  19. 将知网下载的CAJ文件转为PDF 踩坑详记
  20. Android——GT-DataBinding(彻底解放 findViewById)

热门文章

  1. Android App的启动过程
  2. php-7.3.13 configure: error: Please reinstall the libzip distribution
  3. [JS]在ACM模式下获取输入
  4. Andriod TextView typeface
  5. 第五次作业 何雅
  6. 【转载】浏览器事件循环机制(event loop)
  7. BZOJ4152 AMPPZ2014 The Captain(最短路)
  8. python学习-day2_课堂作业
  9. 2022-2028年中国出行O2O市场深度调研及投资前景预测报告
  10. IDEA键盘突然失去响应