• EXPLAIN解析SELECT语句执行计划: EXPLAIN与DESC同义,通过它可解析MySQL如何处理SELECT,提供有关表如何联接和联接的次序,还可以知道什么时候必须为表加入索引以得到一个使用索引来寻找记录的更快的SELECT。为了强制优化器让一个SELECT语句按照表命名顺序的联接次序,语句应以STRAIGHT_JOIN而不只是SELECT开头。EXPLAIN为用于SELECT语句中的每个表返回一行信息。表以它们在处理查询过程中将被MySQL读入的顺序被列出。MySQL用一遍扫描多次联接(single-sweep multi-join)的方式解决所有联接。这意味着MySQL从第一个表中读一行,然后找到在第二个表中的一个匹配行,然后在第3个表中等等。当所有的表处理完后,它输出选中的列并且返回表清单直到找到一个有更多的匹配行的表。从该表读入下一行并继续处理下一个表。EXPLAIN通常可如下使用:

    1. explain select id,name from users where age > 20;
    2. 或者 explain extended select id,name from users where age > 20;show warnings;
  • JOIN代替子查询:MySQL子查询大多数时候执行起来比较慢,而JOIN效率高的多,所以选择使用合适的JOIN类型来替换子查询
  • BINARY / VARBINARY 与 BIT 的差异

    1. BIT(M)存储M bits的0/1序列,M介于1~64之间,须采用 b'value'标记方式指定一个BIT数值类型的值,如 INSERT INTO t SET b = b'1010';
    2. BIT类型的值是不可读的,"+ 0"或者用BIN()、CAST()之类的函数转换后方可读,如 SELECT b+0, BIN(b), OCT(b), HEX(b) FROM t;
    3. BINARY / VARBIANRY 同 CHAR / VARCHAR 相似,除了 BIANARY / VARBINARY 只包含字节流,没有字符集的概念,排序和比较操作都是基于字节的数字值;
    4. BINARY(255) / VARBIANRY(65535) 允许的最大长度同 CHAR / VARCHAR 一样,但前者以字节而非字符为单位计算长度,后者是字符集相关的,VARCHAR若采用了UTF-8字符集编码则长度最大值很可能小于65535。

    下边是对于VARCHAR(M) 和 LONGTEXT的解释:

    VARCHAR(M)A variable-length string. M represents the maximum column length in characters. The range of M is 0 to 65,535. The effective maximum length of a VARCHAR is subject to the maximum row size (65,535 bytes, which is shared among all columns) and the character set used. For example, utf8 characters can require up to three bytes per character, so a VARCHAR column that uses the utf8 character set can be declared to be a maximum of 21,844 characters.
    
    LONGTEXTA TEXT column with a maximum length of 4,294,967,295 or 4GB (2^32 − 1) characters. The effective maximum length is less if the value contains multibyte characters. The effective maximum length of LONGTEXT columns also depends on the configured maximum packet size in the client/server protocol and available memory. Each LONGTEXT value is stored using a 4-byte length prefix that indicates the number of bytes in the value.

    更多可参考 Choosing the Right Type for a Column 。

  • 几种索引的区别

    1. 聚簇索引(Clustered Index):也叫聚集索引,在叶子页(Leaf Page)中存储了完整的数据行,实际也是表的一种数据存储方式,这样的表也称索引组织表(Index Organized Table, IOT)。一个InnoDB表中通常只能有一个聚簇索引,被定义在主键上。MYISAM 不支持该索引类型,其索引文件(.MYI)和数据文件(.MYD)是相互独立的。

    INNODB和MYISAM的主键索引与二级索引的对比:可以看出MYISAM的主键索引和二级索引没有任何区别,主键索引仅仅只是一个叫做PRIMARY KEY的唯一非空的索引,因此 MYISAM 可以不设主键。


    2. 辅助索引(Secondary Index):又叫二级索引,指除聚簇索引之外的所有索引。InnoDB的二级索引的叶子节点包含主键值而不是行指针(Row Pointer),这减小了移动数据或者数据页面分裂时维护二级索引的开销,因为InnoDB不需要更新索引的行指针。
    3. 覆盖索引:指索引包含了满足查询结果的数据,另一种理解认为也应包含查询条件中所涉及的字段。其最大的好处就是避免了读取磁盘数据文件中的行,Innodb的辅助索引叶子节点包含的是主键列,所以主键一定是被索引覆盖的。

  • 主从复制: MySQL 在每个事务更新数据之前,由 Master 将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的,之后通知存储引擎提交事务。MySQL支持三种复制方式,实现了Data Distribution、Load Balancing、Backups、High Availability and Failover等特性。

    1. 基于语句复制:在主服务器上执行的SQL语句,在从服务器上执行同样的语句。MySQL默认采用基于语句的复制,效率比较高。

    2. 基于行复制:MySQL5.0开始支持把改变的内容复制过去,而不是把命令在从服务器上执行一遍。

    3. 混合类型复制:默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。

    复制过程是通过三个线程来完成的,
    1. Master binlog输出线程:Master为每一个复制连接请求创建一个binlog输出线程,用于输出日志内容到相应的Slave;
    2. Slave I/O线程:在start slave之后,该线程负责从Master上拉取binlog内容放进自己的Relay Log中;
    3. Slave SQL线程:负责执行Relay Log中的语句。

  • max_connections 和 max_user_connectionsmax_connections默认是151,当MySQL与Apache Web服务器一起使用时,可以提高性能。mysqld实际上允许max_connections + 1客户端连接,额外的1个连接预留给具有超级权限的帐户使用。Linux或Solaris如果有可用的RAM,支持至少500到1000个并发连接甚至多达10000个;Windows限制open tables × 2 + open connections < 2048。max_user_connections指定一个非0值用来限定任何账号能同时打开的最大连接数。MySQL permits limits for individual accounts on use of these server resources,如果要针对特定账号进行限制可使用Create user或Alter user,如 ALTER USER 'francis'@'localhost' WITH MAX_QUERIES_PER_HOUR 100。更多信息可参考 Setting Account Resource Limits
    Any statement that a client can issue counts against the query limit, unless its results are served from the query cache. Only statements that modify databases or tables count against the update limit.

Mysql相关知识点梳理(一):优化查询的更多相关文章

  1. sql注入原理+mysql相关知识点

    什么是SQL注入 sql就是经常说的数据库,而sql注入就是通过把SQL命令插入到Web表单递交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令.SQL注入是比较常见的网络攻击 ...

  2. mysql之数据库添加索引优化查询效率

    项目中如果表中的数据过多的话,会影响查询的效率,那么我们需要想办法优化查询,通常添加索引就是我们的选择之一: 1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `t ...

  3. mysql 之 group by 性能优化 查询与统计分离

    背景介绍 记录共128W条!   SELECT cpe_id, COUNT(*) restarts FROM business_log WHERE operate_time>='2012-12- ...

  4. mysql explain的使用(优化查询)

    explain显示了mysql如何使用索引来处理select语句以及连接表.可以帮助选择更好的索引和写出更优化的查询语句. 1.创建数据库 创建的sql语句如下: /* Navicat MySQL D ...

  5. Mysql相关知识点总结(一)

    information_schema库:information_schema库中的表大都是temporory表,都是只读的,不能进行更新.删除和插入等操作,也不能加触发器,因为它们实际只是一个视图,不 ...

  6. mysql基本知识点梳理和查询优化

    目录 一.索引相关 二.EXPLIAN中有用的信息 三.字段类型和编码 四.SQL语句总结 五.踩坑 六.千万大表在线修改 七.慢查询日志 八.查看sql进程和杀死进程 九.一些数据库性能的思考 本文 ...

  7. mysql use index () 优化查询的例子

    USE INDEX在你查询语句中表名的后面,添加 USE INDEX 来提供你希望 MySQ 去参考的索引列表,就可以让 MySQL 不再考虑其他可用的索引.Eg:SELECT * FROM myta ...

  8. mysql基础知识点梳理

    ##本单元目标 一.为什么要学习数据库 二.数据库的相关概念DBMS.DB.SQL 三.数据库存储数据的特点 四.初始MySQL MySQL产品的介绍MySQL产品的安装 ★MySQL服务的启动和停止 ...

  9. Java并发相关知识点梳理和研究

    1. 知识点思维导图 (图比较大,可以右键在新窗口打开) 2. 经典的wait()/notify()/notifyAll()实现生产者/消费者编程范式深入分析 & synchronized 注 ...

随机推荐

  1. JAVA 递归实现从n个数中选取m个数的所有组合

    这周Java课程有个小作业:Java递归实现从n个数中选取m个数的所有组合 代码如下: //其中 n 取 1,2,3,4,5 五个数, m 取 3 package javaText; public c ...

  2. ZYNQ EMIO使用及可重用封装

    为了快速实现算法板级验证,PC端需要通过JTAG或以太网与FPGA形成通路.最简单便捷的方案是利用协议栈芯片,用户可以无视底层,利用简单的SPI协议读写寄存器实现复杂的TCP UDP等网络协议.当然带 ...

  3. Python(五)模块

    本章内容: 模块介绍 time & datetime random os sys json & picle hashlib XML requests ConfigParser logg ...

  4. docker容器日志收集方案汇总评价总结

    docker日志收集方案有太多,下面截图罗列docker官方给的日志收集方案(详细请转docker官方文档).很多方案都不适合我们下面的系列文章没有说. 经过以下5篇博客的叙述简单说下docker容器 ...

  5. c#语法学习

    自动属性.隐试类型.命名参数和自动初始化器. note:这里说的这些,是语法糖.按照一定的格式写,部分代码编译器帮我们实现了, 1.自动属性:自动属性是非常有用的语法糖,帮我我们做了两件事:1.自动帮 ...

  6. C# for循环或者foreach往List中添加对象的时候前面的数据总被最后加入的覆盖

    昨天我旁边小姐姐遇到一个问题,就是在执行for循环往list添加数据的时候,前面的数据信息总是被后面的数据信息所覆盖.  这样编写就会造成这样的数据效果:(所有的数据都会被覆盖)     问题原因:对 ...

  7. MySQL之库相关操作

    一 系统数据库 information_schema: 虚拟库,不占用磁盘空间,存储的是数据库启动后的一些参数,如用户表信息.列信息.权限信息.字符信息等performance_schema: MyS ...

  8. docker 常用命令和常用容器启动

    docker:systemctl start docker # docker 启动systemctl stop docker # docker 停止systemctl restart docker # ...

  9. [LeetCode] 7. 整数反转

    题目链接:https://leetcode-cn.com/problems/reverse-integer/ 题目描述: 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 示例 ...

  10. redis 初步认识四(redis锁,防并发)

    using System; namespace ConsoleAppRedis { class Program { static void Main(string[] args) { //第一种,无登 ...