• 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. swift修改UITextfield的Placeholder字体大小和颜色

    第一种方法: self.userNumber.setValue(UIColor.lightGray, forKey: "_placeholderLabel.textColor") ...

  2. wxPython的简单应用

  3. windows 与 Centos7 共享文件方法

    转自:https://www.cnblogs.com/zejin2008/p/7144514.html 先安装包依赖: yum -y install kernel-devel-$(uname -r) ...

  4. 同步锁Synchronized与Lock的区别?

    synchronized与Lock两者区别: 1:Lock是一个接口,而Synchronized是关键字. 2:Synchronized会自动释放锁,而Lock必须手动释放锁. 3:Lock可以让等待 ...

  5. C语言简单实现链栈基本几个功能

            接着上一次的顺序栈,今天我记一下链栈,因为我也是刚学不久,有些地方也稍稍理解不了,所以,一起共勉.我会用我自己结合教材上画的图,争取跟代码一起结合,用文字和图最大化的解释代码,这样的话 ...

  6. .net 获取远程访问的ip

    这两天一直做获取远程访问的ip和自己的ip相关的问题. 在解决获取ip相关问题的时候,主要使用了上下文对象,httpcontext对象.原理很简单,内部有两大对象,request和response.里 ...

  7. Zabbix 3.4.7调整监控阈值以及告警级别

    1.找到需要监控的主机:右上角进行搜索 我们要更改sepm02p的阈值和级别: 进行更改级别:先点击Triggers , 选中要更改的监控项,例如我要更改CPU,点击以下红色标出的,千万不要选择Tem ...

  8. 好程序员分享居中一个float元素

    好程序员分享居中一个float元素,我们布局的时候,用margin来设置float元素的外边距来达到效果.对于,在文档流中的元素,我们很容易让它水平居中,只要给元素设置一个固定的宽度,用margin: ...

  9. (四)esp8266 MDNS域名服务

    (实例一)ESP8266 TFT(ST7735)彩屏-web刷图 https://www.arduino.cn/thread-42247-1-1.html (实例二) 自己当AP时建立MDNS域名 h ...

  10. Linux下Power Management开发总结

    本文作为一个提纲挈领的介绍性文档,后面会以此展开,逐渐丰富. 1. 前言 在 <开发流程>中介绍了PM开发的一般流程,重点是好的模型.简单有效的接口参数.可量化的测试环境以及可独性强的输出 ...