20200617学习笔记[通俗易懂]

20200617学习笔记[通俗易懂]基数 一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好 我们可以使用 show index 方法,看到一个索引的基数 MySQL 是怎…

20200617学习笔记

基数

 一个索引上不同的值的个数,我们称之为“基数”(cardinality)。也就是说,这个基数越大,索引的区分度越好

我们可以使用 show index 方法,看到一个索引的基数

MySQL 是怎样得到索引的基数的呢?

采样统计 : 因为把整张表取出来一行行统计,虽然可以得到精确的结果,但是代价太高了,所以只能选择“采样统计”。

采样统计的时候,InnoDB 默认会选择 N 个数据页,统计这些页面上的不同值,得到一个平均值,然后乘以这个索引的页面数,就得到了这个索引的基数

而数据表是会持续更新的,索引统计信息也不会固定不变。所以,当变更的数据行数超过 1/M 的时候,会自动触发重新做一次索引统计

在 MySQL 中,有两种存储索引统计的方式,可以通过设置参数 innodb_stats_persistent 的值来选择:设置为 on 的时候,表示统计信息会持久化存储。这时,默认的 N 是 20,M 是 10。设置为 off 的时候,表示统计信息只存储在内存中。这时,默认的 N 是 8,M 是 16。

analyze table t 命令,可以用来重新统计索引信息

给字符串加索引

一张email表给email列加索引,语句如下

  • mysql> alter table SUser add index index1(email);  //默认整个email字段
  • mysql> alter table SUser add index index2(email(6)); //取email字段前六个字符
  • 截取部分字符当索引的优点: 占用空间少
  • 带来的问题: 不恰当的长度会减小基数
  • 如何确定长度: 
    • 先统计整个表不同的数据有多少条 select count(distinct email) as L from t;
    • 然后假设再统计不同email长度对应的count是多少:
//挑选一个在你可接受的损失范围的长度即可
mysql> select count(distinct left(email,4))as L4, 
              count(distinct left(email,5))as L5, 
              count(distinct left(email,6))as L6, 
              count(distinct left(email,7))as L7 
              from t;

代码100分

  • 也就是说使用前缀索引,定义好长度,就可以做到既节省空间,又不用额外增加太多的查询成本。
  • 注意:使用了前缀索引那么就相当于放弃了覆盖索引的优化

脏页和干净页

  • 当内存数据页跟磁盘数据页内容不一致的时候,我们称这个内存页为“脏页”。
  • 内存数据写入到磁盘后,内存和磁盘上的数据页的内容就一致了,称为“干净页”。
  • 把内存里的数据写入磁盘的过程,术语就是 flush

平时执行很快的更新操作,其实就是在写内存和日志,而 MySQL 偶尔“抖”一下的那个瞬间,可能就是在刷脏页(flush) ,一下四种情况

20200617学习笔记[通俗易懂]

  1. redo log 写满了,停止更新操作, 把 checkpoint 往前推进,redo log 留出空间可以继续写
  2. 系统内存不足, 当需要新的内存页,而内存不够用的时候,就要淘汰一些数据页,空出内存给别的数据页使用。如果淘汰的是“脏页”,就要先将脏页写到磁盘。
  3. 系统空闲,flush脏页(非上述问题原因)
  4. 一个sql中存在大量的flush 脏页的行为
  5. 系统正常关闭,flush脏页
  • innodb_io_capacity 参数可以告诉InnoDB电脑刷脏页的能力

试想一下,如果你来设计策略控制刷脏页的速度,会参考哪些因素呢?

  • InnoDB 的刷盘速度就是要参考这两个因素:一个是脏页比例,一个是 redo log 写盘速度。
  • 参数 innodb_max_dirty_pages_pct 是脏页比例上限,默认值是 75%。InnoDB 会根据当前的脏页比例(假设为 M),算出一个范围在 0 到 100 之间的数字
  • InnoDB 每次写入的日志都有一个序号,当前写入的序号跟 checkpoint 对应的序号之间的差值,我们假设为 N
  • 20200617学习笔记[通俗易懂]

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/7864.html

(0)
上一篇 2023-03-12
下一篇 2023-03-12

相关推荐

  • mysql8.0修改用户权限_mysql给用户赋予权限

    mysql8.0修改用户权限_mysql给用户赋予权限最近测试中台的存储服务,涉及到MySQL用户操作的命令,记录一下。 1、查看所有用户 select user from mysql.user; 2、查看当前登陆用户 select user(); 3、

    2023-04-16
    137
  • MySQL 字符串截取_sql截取某个字段某个字符后面的

    MySQL 字符串截取_sql截取某个字段某个字符后面的使用SUBSTRING_INDEX()函数 substring_index(str,delim,count) str:要处理的字符串 delim:分隔符 count:分隔符计数 例子 取出上述表中数…

    2023-02-10
    139
  • 技术分享 | MySQL 优化:JOIN 优化实践「建议收藏」

    技术分享 | MySQL 优化:JOIN 优化实践「建议收藏」作者:胡呈清 近期刚好学习了丁奇老师的《MySQL 实战 45 讲》中的 join 优化相关知识,又刚刚好碰上了一个非常切合的 join 查询需要优化,分析过程有些曲折,记录下来留作笔记。 问题 S…

    2023-01-24
    138
  • Python快速注释技巧

    Python快速注释技巧在编写代码的过程中,我们时常会遇到新的需求、新的技术难点或是不可预知的bug。此时,阅读代码的团队成员可能并不清楚我们的思路,并且在阅读一些复杂的代码时,有时代码的意图并不是那么显然。好的注释可以为别人阅读和理解代码提供便利,并帮助团队成员更好地进行协作。另外,在我们自己进行代码回顾或者重构的时候,注释也是非常重要的。

    2024-07-06
    29
  • Python函数之文件读写操作

    Python函数之文件读写操作文件的读写操作是编程过程中经常使用到的操作之一,在python中使用函数实现文件的读写操作可以提高操作的效率和准确性。Python提供了一些内置函数和模块来实现文件的读写操作,如open()函数,os模块等。

    2024-04-04
    69
  • Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法[通俗易懂]

    Oracle调用Java方法(上)如何使用LoadJava命令和如何将简单的Jar包封装成Oracle方法[通俗易懂]最近在工作中遇到了遇到了一个需求需要将TIPTOP中的数据导出成XML并上传到FTP主机中,但是4GL这方面的文档比较少最终决定使用Oracle调用Java的方法,在使用的过程中发现有很多的坑,大部分

    2023-03-13
    147
  • wordpress本地迁移到服务器_wordpress备份插件

    wordpress本地迁移到服务器_wordpress备份插件作者: 吴炳锡,知数堂联合创始人及MySQL高级讲师,3306π社区联合创始人,腾讯TVP成员。 本文大概5500字,阅读大概需要15分钟,建议电脑前阅读。大纲如下: 概述 使用Radon atta…

    2023-02-09
    151
  • MYSQL数据库优化(一)[通俗易懂]

    MYSQL数据库优化(一)[通俗易懂]内存的读写速度远大于磁盘的读写速度,减少磁盘读写,可以作为重点优化方向。 数据库内部最重要的就是存储结构,存储结构必然涉及到数据结构知识。比如用到了常用的哈希图、树。 MYSQL数据库常用两种引擎,I

    2023-02-27
    150

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注