文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

MYSQL 高级

2018-06-04 21:24

关注

MYSQL 高级

SQL查询流程:

 

 

MySQL物理文件:

 

 日志文件:

-- 查看错误日志文件路径
show variables like "log_error";
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
-- 慢查询日志文件路径
show variables like "slow_query_log_file";
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
-- bin log 日志文件 需要在 my.cnf 中配置
log-bin=/var/log/mysql-bin/bin.log
server-id=2
-- 查看 relay log 相关参数
show variables like "%relay%"

配置文件&数据文件:

配置文件 my.cnf:

  在 my.cnf 文件中可以进行一些参数设置, 对数据库进行调优。

[client] #客户端设置,即客户端默认的连接参数
port = 3307 #默认连接端口
socket = /data/mysqldata/3307/mysql.sock #用于本地连接的socket套接字
default-character-set = utf8mb4 #编码
[mysqld] #服务端基本设置
port = 3307 MySQL监听端口
socket = /data/mysqldata/3307/mysql.sock #为MySQL客户端程序和服务器之间的本地通讯指定一
个套接字文件
pid-file = /data/mysqldata/3307/mysql.pid #pid文件所在目录
basedir = /usr/local/mysql-5.7.11 #使用该目录作为根目录(安装目录)
datadir = /data/mysqldata/3307/data #数据文件存放的目录
tmpdir = /data/mysqldata/3307/tmp #MySQL存放临时文件的目录
character_set_server = utf8mb4 #服务端默认编码(数据库级别)
-- 查看数据文件的位置
show variables like "%dir%";
+-----------------------------------------+----------------------------+
| Variable_name | Value |
+-----------------------------------------+----------------------------+
| datadir | /var/lib/mysql/ |
+-----------------------------------------+----------------------------
1、.frm文件
不论是什么存储引擎,每一个表都会有一个以表名命名的.frm文件,与表相关的元数据(meta)信息都存放在
此文件中,包括表结构的定义信息等。
2、.MYD文件
myisam存储引擎专用,存放myisam表的数据(data)。每一个myisam表都会有一个.MYD文件与之呼应,同
样存放在所属数据库的目录下
3、.MYI文件
也是myisam存储引擎专用,存放myisam表的索引相关信息。每一个myisam表对应一个.MYI文件,其存放的
位置和.frm及.MYD一样
4、.ibd文件
存放innoDB的数据文件(包括索引)。
5. db.opt文件 此文件在每一个自建的库里都会有,记录这个库的默认使用的字符集和校验规。

MySQL查询和慢查询日志分析:

  等待时间长: 

  执行时间长:

需要遵守的优化原则:

     一定要为查询语句指定 WHERE 条件,过滤掉不需要的数据行

    避免使用 select * from , 因为它表示查询表中的所有字段

经常出现在 WHERE 条件中的字段建立索引,可以避免全表扫描;

将 ORDER BY 排序的字段加入到索引中,可以避免额外的排序操作;

多表连接查询的关联字段建立索引,可以提高连接查询的性能;

将 GROUP BY 分组操作字段加入到索引中,可以利用索引完成分组。

在 WHERE 子句中对索引字段进行表达式运算或者使用函数都会导致索引失效

使用 LIKE 匹配时,如果通配符出现在左侧无法使用索引

如果 WHERE 条件中的字段上创建了索引,尽量设置为 NOT NULL

SQL的执行顺序:

  我们写的sql:

 

sql的执行顺序:

 

 

 MYSQL的7种join:

 

 

 

慢查询日志分析: 

   MySQL的慢查询,全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中响应时间 超过阈值的语句。

   默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。

      如果不是调优需要的话,一般不建议启动该参数,因为开启慢查询日志会或多或少带来一定的性能影 响。

      慢查询日志支持将日志记录写入文件和数据库表。

SHOW VARIABLES LIKE "%query%" ;

slow_query_log:是否开启慢查询日志, 1 表示开启, 0 表示关闭。
slow-query-log-file:新版(5.6及以上版本)MySQL数据库慢查询日志存储路径。
long_query_time: 慢查询阈值,当查询时间多于设定的阈值时,记录日志。
默认情况下slow_query_log的值为OFF,表示慢查询日志是禁用的

mysql> SHOW VARIABLES LIKE "%slow_query_log%";
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | OFF |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+
可以通过设置slow_query_log的值来开启

mysql> set global slow_query_log=1;
mysql> SHOW VARIABLES LIKE "%slow_query_log%";
+---------------------+-----------------------------------+
| Variable_name | Value |
+---------------------+-----------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/localhost-slow.log |
+---------------------+-----------------------------------+

  使用 set global slow_query_log=1 开启了慢查询日志只对当前数据库生效,MySQL重启后则 会失效。

  如果要永久生效,就必须修改配置文件my.cnf(其它系统变量也是如此)

-- 编辑配置
vim /etc/my.cnf
-- 添加如下内容
slow_query_log =1
slow_query_log_file=/var/lib/mysql/lagou-slow.log
-- 重启MySQL
service mysqld restart
mysql> SHOW VARIABLES LIKE "%slow_query_log%";
+---------------------+-------------------------------+
| Variable_name | Value |
+---------------------+-------------------------------+
| slow_query_log | ON |
| slow_query_log_file | /var/lib/mysql/lagou-slow.log |
+---------------------+-------------------------------+

那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢?

这个是由参数 long_query_time 控制,默认情况下long_query_time的值为10秒

mysql> show variables like "long_query_time";
+-----------------+-----------+
| Variable_name | Value |
+-----------------+-----------+
| long_query_time | 10.000000 |
+-----------------+-----------+

注意:使用命令 set global long_query_time=1 修改后,需要重新连接或新开一个会话才能 看到修改值。

mysql> set global long_query_time=1;
mysql> show variables like "long_query_time";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 1.000000 |
+-----------------+----------+

log_output 参数是指定日志的存储方式。 log_output="FILE" 表示将日志存入文件,默认值 是"FILE"。

log_output="TABLE" 表示将日志存入数据库,这样日志信息就会被写入到 mysql.slow_log 表中。

mysql> SHOW VARIABLES LIKE "%log_output%";
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| log_output | FILE |
+---------------+-------+

 系统变量 log-queries-not-using-indexes :未使用索引的查询也被记录到慢查询日志中(可选 项)。如果调优的话,建议开启这个选项。

mysql> show variables like "log_queries_not_using_indexes";
+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | OFF |


mysql> set global log_queries_not_using_indexes=1;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like "log_queries_not_using_indexes";

+-------------------------------+-------+
| Variable_name | Value |
+-------------------------------+-------+
| log_queries_not_using_indexes | ON |
+-------------------------------+-------+
1 row in set (0.00 sec)

MySQL存储引擎:

InnoDB(推荐):

  优点:

   缺点:

 应用场景 :

MyISAM:

优点:

缺点:

应用场景:

MySQL索引优化:

普通索引:

CREATE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名) );

唯一索引:

CREATE UNIQUE INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD UNIQUE INDEX [索引的名字] (字段名);
CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (字段名) ;

主键索引:

CREATE TABLE tablename ( [...], PRIMARY KEY (字段名) );
ALTER TABLE tablename ADD PRIMARY KEY (字段名);

复合索引:

  用户可以在多个列上建立索引,这种索引叫做组复合索引(组合索引)。复合索引可以代替 多个单一索引,相比多个单一索引复合索引所需的开销更小。

CREATE INDEX <索引的名字> ON tablename (字段名1,字段名2...);
ALTER TABLE tablename ADD INDEX [索引的名字] (字段名1,字段名2...);
CREATE TABLE tablename ( [...], INDEX [索引的名字] (字段名1,字段名2...) );

复合索引注意事项:

全文索引:

  查询操作在数据量比较少时,可以使用like模糊查询,但是对于大量的文本数据检索,效率很 低。如果使用全文索引,查询速度会比like快很多倍。

CREATE FULLTEXT INDEX <索引的名字> ON tablename (字段名);
ALTER TABLE tablename ADD FULLTEXT [索引的名字] (字段名);
CREATE TABLE tablename ( [...], FULLTEXT KEY [索引的名字] (字段名) ;

和常用的like模糊查询不同,全文索引有自己的语法格式,使用 match 和 against 关键字,比如:

SELECT * FROM users3 WHERE MATCH(NAME) AGAINST("aabb");
-- * 表示通配符,只能在词的后面
SELECT * FROM users3 WHERE MATCH(NAME) AGAINST("aa*" IN BOOLEAN MODE);

全文索引使用注意事项:

创建索引的原则:

索引原理:

  hash 结构:

    Hash底层实现是由Hash表来实现的,是根据键值 存储数据的结构。非常适合根据 key查找value值,也就是单个key查询,或者说等值查询。

  B+Tree结构

    非叶子节点不存储data数据,只存储索引值,这样便于存储更多的索引值 叶子节点包含了所有的索引值和data数据 叶子节点用指针连接,提高区间的访问性能

 

 

 EXPLAIN性能分析:

  

 

id:

   id相同,执行顺序由上至下

  id不同,如果是子查询,id的序号会递增,id值越大优先级越高,越先被执行

 

 

 select_type:

  simple : 简单的select查询,查询中不包含子查询或者UNION

  primary : 查询中若包含任何复杂的子部分,最外层查询被标记

  subquery : 在select或where列表中包含了子查询

  

 

union : 如果第二个select出现在UNION之后,则被标记为UNION,如果union包含在from子句 的子查询中,外层select被标记为derived

 

 

 type介绍:

  type显示的是连接类型,是较为重要的一个指标。

  下面给出各种连接类型,按照从最佳类型到最坏类型 进行排序:

     system > const > eq_ref > ref > range > index > ALL

system : 表仅有一行 (等于系统表)。这是const连接类型的一个特例,很少出现。

const : 表示通过索引 一次就找到了, const用于比较 primary key 或者 unique 索引. 因为只匹配 一行数据,所以如果将主键 放在 where条件中, MySQL就能将该查询转换为一个常量

 

 

 eq_ref : 唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配. 常见与主键或唯一索引扫描

 

 

 ref : 非唯一性索引扫描, 返回匹配某个单独值的所有行, 本质上也是一种索引访问, 它返回所有匹配 某个单独值的行, 这是比较常见连接类型.

 

 

 range : 只检索给定范围的行,使用一个索引来选择行。

 

 

 index : 出现index 是 SQL 使用了索引, 但是没有通过索引进行过滤,一般是使用了索引进行排序分 组

 

 

 

ALL : 对于每个来自于先前的表的行组合,进行完整的表扫描。

 

 

 possible_keys:显示可能应用到这张表上的索引, 一个或者多个. 查询涉及到的字段上若存在索引, 则该索引将 被列出, 但不一定被查询实际使用

key :实际使用的索引

 

key_len介绍:

 

 表示索引中使用的字节数, 可以通过该列计算查询中使用索引的长度.

CREATE TABLE T1(
a INT PRIMARY KEY,
b INT NOT NULL,
c INT DEFAULT NULL,
d CHAR(10) NOT NULL
);

EXPLAIN SELECT * FROM T1 WHERE a > 1 AND b = 1;

ALTER TABLE T1 ADD INDEX idx_b(b);

 

 

ALTER TABLE T1 ADD INDEX idx_d(d);

 

 

 

 

    

 

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯