Mysql DOC阅读笔记

合理利用索引

隔离调试查询中花费高的部分,例如函数调用是在结果集中的行执行还是全表中的行执行

最小化全表扫描的数量,特别是在大表中

定期使用ANALYZE TABLE语句更新表的统计数据,使查询优化器可以做出更合理的优化。

学习各个存储引擎的特殊调试,索引和配置

优化单条只读查询事务

避免使用难以理解的方式编写QUERY,因为查询优化器可能使用的还是同样的优化决策,不要牺牲SQL的可读性

如果性能问题不能通过基本的GUIDELINES解决,那么使用EXPLAIN语句查看更具体的信息

调整MySQL所使用到的用作缓存的内存区域,例如(InnoDB buffer pool, MyISAM key cache, MySQL query cache)

小心处理锁的问题

结果字段

id : SELECT的标识符

select_type : SELECT的类型

SIMPLE : Simple SELECT (not using UNION or subqueries)

PRIMARY : Outermost SELECT

UNION : Second or later SELECT statement in a UNION

DEPENDENT UNION : Second or later SELECT statement in a UNION, dependent on outer query

UNION RESULT RESULT of a UNION

SUBQUERY First SELECT in subquery

DEPENDENT SUBQUERY First SELECT in subquery, dependent on outer query.

DERIVED Derived table SELECT (subquery in FROM clause)

MATERIALIZED Materialized subquery

UNCACHEABLE SUBQUERY A subquery for which the result cannot be cached and must be re-evaluated for each row of the outer query

table : The name of the table to which the row of output refers

M,N为子查询的id

N为子查询的id

N为子查询的id

partitions : 使用的分区

possible_keys : 可选的索引

key : 查询用到的key或者index

key_len : The key_len column indicates the length of the key that MySQL decided to use. The length is NULL if the key column says NULL. Note that the value of key_len enables you to determine how many parts of a multiple-part key MySQL actually uses

ref : The ref column shows which columns or constants are compared to the index named in the key column to select rows from the table.

rows : The rows column indicates the number of rows MySQL believes it must examine to execute the query

filtered : The filtered column indicates an estimated percentage of table rows that will be filtered by the table condition. That is, rows shows the estimated number of rows examined and rows × filtered / 100 shows the number of rows that will be joined with previous tables.

Extra : This column contains additional information about how MySQL resolves the query. See Explain Extra Information

MySQL Index

多列索引,查询条件需要按照列的顺序并且起始列为索引的起始列,中间不能有间隔

使用MIN()或者MAX()查询的时候多列索引的使用也遵循最左列的原则,即WHERE中要先使用多列索引中的最左列,那么查询优化器会将MIN()和MAX()做一个key上的扫描,然后将常数的结果进行替换。例如: SELECT MIN(key_part2),MAX(key_part2) FROM tbl_name WHERE key_part1=10;

LIKE也能使用索引,只要参数是常量,并且不以通配符开头

在不通列的对比中如果要使用索引,需要两个列的数据类型一样,CHAR(10)和VARCHAR(10)被认为是一样的。

多列索引的实现: A multiple-column index can be considered a sorted array, the rows of which contain values that are created by concatenating the values of the indexed columns.

InnoDB的聚簇索引含有列数据,优先建立组合索引而不是每一列的单独索引。InnoDB的二级索引的叶子节点中存储的是PK,而不是行号。MyISAM的索引是非聚簇索引,叶子节点中是行指针。See more

在where条件中查询条件对索引使用的影响:

Any index that does not span all AND levels in the WHERE clause is not used to optimize the query. In other words, to be able to use an index, a prefix of the index must be used in every AND group. The following WHERE clauses use indexes:

... WHERE index_part1=1 AND index_part2=2 AND other_column=3

/* index = 1 OR index = 2 */

... WHERE index=1 OR A=10 AND index=2

/* optimized like "index_part1='hello'" */

... WHERE index_part1='hello' AND index_part3=5

/* Can use index on index1 but not on index2 or index3 */

... WHERE index1=1 AND index2=2 OR index1=3 AND index3=3;

These WHERE clauses do not use indexes:

/* index_part1 is not used */

... WHERE index_part2=1 AND index_part3=2

/* Index is not used in both parts of the WHERE clause */

... WHERE index=1 OR A=10

/* No index spans all rows */

... WHERE index_part1=1 OR index_part2=10

buffer pool

buffer pool 是Mysql中用来存放InnoDB的表和索引数据的内存区域, 这些内存区域被划分成页。buffer pool使用使用linked list作为pages的实现。页的交换使用LRU算法,在大内存的系统中,你可以将buffer pool划分成多个buffer pool instances。 innodb_buffer_pool_size中配置的内存大小被所有buffer pool实例所分割,多buffer pool实例更适给Innodb buffer pool划分几个G以上空间的应用,每一个实例都可以得到一个1G或者以上大小的空间。

Read-Only Transactions

如果InnoDB可以提前知道一个事务是只读事务,那么它就可以避免使用transaction ID(TRX_ID)。Transaction ID只需要在语句存在更新或者读语句中存在锁的情况中使用。 InnoDB是这样检测只读事务的:

事务以START TRANSACTION READ ONLY语句开始,但是这种情况仍可以对session-specific临时表进行更新,因为对这些表进行更新不影响其他事务。

autocommit标志位打开的情况下,所有事务都是一条但语句,那么没有更新的语句将会被包装成只读事务。

事务没有用READ ONLY选项,但是还没有更新语句或者明确的锁语句,这时候事务是一个只读事务,知道遇到了一个明确的锁或者更新语句。 所以,对于查询语句可以将它们放在一个READ ONLY事务中,或者在执行select语句之前打开autocommit选项,或者只是简单的不要吧DML放在DQL中间。

Other

innodb行锁的实现方式

对于innodb的表而言,insert、update、delete等操作虽然都是加行级锁,但这些行锁都是通过给索引上的索引项加锁来实现的,这就意味着:只有通过索引条件检索数据,innodb才能使用行级锁,否则,innodb将使用表级锁。 * 在不通过索引条件检索的时候,innodb使用的是表锁,不是行锁。 例如:

create table tab_no_index(id int,name varchar(10)) engion=innodb; create table tab_with_index(id int,name varchar(10),key id_idx(id)) engion=innodb; 语句select * from tab_no_index where id=1 for update;会加表锁,而select * from tab_with_index where id=1 for update;会加行锁。

虽然访问不同行的记录,但是如果是使用相同的索引键,仍然会出现锁冲突。 例如,上例表tab_with_index中有两条记录为(1,’1’)和(1,’4’),则select * from tab_with_index where id=1 and name=’1’ for update;会对这两条记录都加锁。

当表有多个索引时,不同的事务可以使用不同的索引锁定不同的行。此外,不论是使用主键索引、唯一索引或普通索引,innodb都会使用行锁对数据加锁。

innodb的间隙锁(Next-key锁)

当使用范围条件而不是相等条件检索数据,并请求共享或排他锁时,innodb会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不 存在的记录,叫做“间隙”,innodb也会对这个“间隙”加锁。例如,emp表中只有101条记录,其中empid为索引键,值分别为 1,2,……,100,101,语句select * from emp where empid>100 for update;不仅会对101记录加锁,还会对empid大于101(这些记录不存在)的“间隙”加锁。

mysql笔记 doc_Mysql DOC阅读笔记相关推荐

  1. [论文笔记] Oriented R-CNN 阅读笔记

    Oriented R-CNN 阅读笔记 Oriented R-CNN for Object Detection(ICCV 2021) 摘要 引言 Oriented R-CNN Oriented RPN ...

  2. 现代php 阅读笔记,PHP 手册阅读笔记 - 语言参考篇

    最近计划把 PHP手册,认真的先过一遍.记录一些以前不知道,不明确的知识. 语言参考 > 类型 [新认知]强制转换类型用 settype( mixed $var, string $type ). ...

  3. 【笔记】注意分配阅读笔记

    1 注意的基本知识: 1.1 注意属于认知心理学的一部分.认知心理学是最新的心理学分支之一,它主要研究人的认知过程,包括注意.感知觉.表象.学习记忆.思维和语言等 人类知觉信息加工: 三个阶段:对外界 ...

  4. QCon 2015 阅读笔记 - 团队建设

    QCon 2015阅读笔记 QCon 2015 阅读笔记 - 移动开发最佳实践 QCon 2015 阅读笔记 - 团队建设 中西对话:团队管理的五项理论和实战 - 谢欣.董飞(今日头条,LinkedI ...

  5. Js引擎解析执行 阅读笔记

    Js引擎解析执行 阅读笔记 一篇阅读笔记 http://km.oa.com/group/2178/articles/show/145691?kmref=search&from_page=1&a ...

  6. 【阅读笔记】应用LRP,通过将相关性从模型的输出层反向传播到其输入层来解释基于RNN的DKT模型(一)

    提示:Towards Interpretable Deep Learning Models for Knowledge Tracing将重点放在应用分层相关传播(LRP)方法,通过将相关性从模型的输出 ...

  7. 【裂缝检测】文献阅读笔记

    本笔记仅供个人回顾使用,未经允许禁止转发 文献相关网站: 中国知网 iData 爱学术[中文文献友好] 一搜即达[科研通聚合搜索] SCI-Hub论文下载可用网址 谷歌学术『Google』镜像 谷歌学 ...

  8. 【笔记】文献阅读[SORT]-SIMPLE ONLINE AND REALTIME TRACKING

    SORT: SIMPLE ONLINE AND REALTIME TRACKING 引言 2 文献综述 3 方法 3.1 检测 3.2 评估模型 3.3 数据关联 4 实验 4.1 指标 4.2 性能 ...

  9. 代码分析:NASM源码阅读笔记

    NASM源码阅读笔记 NASM(Netwide Assembler)的使用文档和代码间的注释相当齐全,这给阅读源码 提供了很大的方便.按作者的说法,这是一个模块化的,可重用的x86汇编器, 而且能够被 ...

最新文章

  1. springboot整合freemarker(转)
  2. 【UI 设计 - Adobe Illustrator】基本设置 (图像显示 | 图像缩放 | 置入导出 | 标尺 | 网格 | 参考线 | 画板)
  3. 公有云 私有云 混合云_混合云的承诺,收益和产品
  4. 最全目标检测相关资料整理 (目标检测+数据增强+卷价神经网络+类别不均衡...)
  5. 我觉得这个世界不是特别的好,你说呢
  6. 如何生成JDK帮助文档
  7. Qt音视频开发41-人脸识别嵌入式
  8. 解压版tomcat7安装教程
  9. 盘点电机重要应用的七大领域
  10. Fedora9 问题集锦
  11. SAR图像的相干斑噪声
  12. 分布式系统的SLA如何定义
  13. webpack打包告警We noticed you‘re using the `useBuiltIns` option without declaring a core-js version.
  14. ubuntu 下使用unixbench 这种benchmark 工具测试系统性能
  15. 用c语言编写一个日期计算器
  16. QGroundControl 提示 Power redundancy not met: 0 instead of 1
  17. 将图片转成base64字符串并在JSP页面显示的Java代码
  18. 给服务器下载补丁及安装补丁
  19. Windows 7驱动开发系列(四)--WDM模型介绍
  20. ambari中zookeeper报错,Connection failed: Expected response imok, Actual response to...

热门文章

  1. 摄影中的色温和白平衡及其二者关系的全面详解
  2. 企业应用开发(4)(补充)--需求说明文档
  3. 初学者学习Python,掌握这些实用小技巧能快速入门!
  4. 初识Typescript及vscode环境配置
  5. CentOS学习笔记(一):中文语言包及输入法的安装使用
  6. Golang学习笔记——Slice
  7. C# 文件流操作 之 删除、复制、转移多个文件
  8. WinForm 限制同一个进程只能打开一次
  9. 详解:数据库名、实例名、ORACLE_SID、数据库域名、全局数据库名、服务名
  10. 使用Reactor进行反应式编程最全教程