揭开 mysql 神秘的面纱(一)

1,869 阅读19分钟

揭开 mysql 神秘的面纱(一)

引言

​ 为什么我们需要学习 mysql ?计算机专业的同学学习的第一个数据库管理系统就是 mysql ,大中小型互联网公司及部分传统行业公司普遍也是采用 mysql 作为关系型数据库管理系统;当然现在国内大厂也有研发适合于自身业务的关系型数据库,但是都是站在巨人的肩膀上去做的。所以,学习 mysql 的必要性不需要过多的探讨。

​ 对于 mysql 的学习不光要学会怎么用,还要了解为什么要这么用,还有老生常谈的优化,以及适应于生产环境的高可用实践方式。那么,让我们一起来揭开 mysql 神秘的面纱。


简介

mysql 是一个开源的、相应快速的、可靠的、可扩展的、易于使用的关系型数据库管理系统,由 Oracle Corporation 开发和支持。

什么是数据库? 数据库就是存储数据的地方,他可以以不同的形式存储;实际上就是一个文件系统,将数据以特定的格式存储起来。用户可以通过SQL对数据库进行新增、删除、修改、查询等操作。

什么是数据库管理系统? 数据库管理系统就是操纵和管理数据库的大型软件,用于建立、使用和维护数据库;对数据库进行统一的管控,保证数据库的安全性和完整性。

什么是关系型数据库? 关系型数据库指以行与列来存储数据的数据库。

历史

  • MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用 BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的 且仅面向报表的存储引擎,名叫Unireg。
  • 1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将 它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。
  • 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版 本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。
  • 1999~2000年,【MySQL AB】公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出 了【Berkeley DB引擎】, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。
  • 2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
  • 2001年,集成Heikki Tuuri的存储引擎【InnoDB】,这个引擎不仅能【支持事务处理,并且支持行 级锁】。后来该引擎被证明是最为成功的MySQL事务存储引擎。【MySQL与InnoDB的正式结合版本是4.0】
  • 2003年12月,【MySQL 5.0】版本发布,提供了视图、存储过程等功能。
  • 2008年1月,【MySQL AB公司被Sun公司以10亿美金收购】,MySQL数据库进入Sun时代。在Sun 时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。
  • 2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。
  • 2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。
  • 2010年12月,【MySQL 5.5发布】,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常 处理功能的支持,【最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎】。MySQL 5.5不是时 隔两年后的一次简单的版本更新,而是加强了MySQL各个方面在企业级的特性。Oracle公司同时也承诺 MySQL 5.5和未来版本仍是采用GPL授权的开源产品。

SQL

SQL是Structured Query Language的缩写,是指结构化查询语言,是一种数据库查询的程序设计编程语言,由于查询、更新和管理关系型数据库系统。它的前身是著名的关系数据库原型系统System R所采 用的SEQUEL语言。作为一种访问【关系型数据库的标准语言】,SQL自问世以来得到了广泛的应用,不仅是著 名的大型商用数据库产品Oracle、DB2、Sybase、SQL Server支持它,很多开源的数据库产品如 PostgreSQL、MySQL也支持它,甚至一些小型的产品如Access也支持SQL。近些年蓬勃发展的NoSQL系统 最初是宣称不再需要SQL的,后来也不得不修正为Not Only SQL,来拥抱SQL。

​ SQL发展的简要历史:

​ 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86

​ 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89

​ 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)

​ 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)

​ 2003年,ISO/IEC 9075:2003,SQL:2003

​ 2008年,ISO/IEC 9075:2008,SQL:2008

​ 2011年,ISO/IEC 9075:2011,SQL:2011

​ SQL92 标准需要我们掌握,因为它涉及了SQL最基础和最核心的一些内容;不只是mysql还有其他数据库,在SQL92或者SQL99这些国际SQL标准基础上,它们还扩展了自己的一些 SQL语句,比如MySQL中的limit关键字。

SQL语言分类

数据定义语言(DDL):用来定义数据库的对象:库、表、列等等。关键字:create、alter、drop、truncate等

​ 常见的DDL:

​ 创建数据库:CREATE DATABASE

​ 创建数据库表格:CREATE TABLE

​ 修改数据库表格:ALTER TABLE

​ 删除数据库表格:DROP TABLE

​ 创建查询命令:CREATE VIEW

​ 删除数据表内容:TRUNCATE TABLE

数据操作语言(DML):用来处理数据库的数据内容。关键字:insert、delete、update等

​ 常见的DML:

​ 插入数据:INSERT INTO TABLE

​ 删除数据:DELETE FROM TABLE

​ 修改数据:UPDATE TABLE SET

数据查询语言(DQL):用来查询数据库的数据内容。关键字:select、from、where等

数据控制语言(DCL):用来定义数据库的访问权限和安全级别及用户创建。关键字:grant等

​ 常见的DCL:

​ 远程授权:GRANT ALL PRIVILEGES ON . TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION;

DDL

数据库操作

  1. 创建数据库

    create database database_name;
    create database database_name character set 字符集;
    # 示例
    create database samir character set UTF8;
    
  2. 查看数据库

    show databases;
    show create database database_name;
    
    # 示例
    show create database samir;
    
  3. 删除数据库

    drop database database_name;
    
    #示例
    drop database samir;
    
  4. 其他数据库操作

    use database_name;
    select database();
    
    # 示例
    use samir;
    

表操作

  1. 创建表

    create table table_name(
        field_name type 约束,
        field_name type 约束,
        field_name type 约束
    );
    
    # 约束分为 主键约束(primary key)、唯一约束(unique)、非空约束(not null)
    # 注意:主键约束和唯一约束唯一的区别在于唯一约束可以为 null
    
    # 示例
    CREATE TABLE `test` (
    	`id`  int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
    	`name`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '名称' ,
    	`dept`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '部门' ,
    	`age`  int(3) NOT NULL DEFAULT 0 COMMENT '年龄' ,
    	`nick`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '昵称' ,
    	PRIMARY KEY (`id`),
    	UNIQUE INDEX `index_test` (`name`) USING BTREE 
    )
    ENGINE=InnoDB
    DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
    ;
    
  2. 查看表

    show tables;
    desc test;
    

    Aleyson爱逼逼

    Aleyson爱逼逼

  3. 删除表

    drop table table_name;
    
    # 示例
    drop table test;
    
  4. 修改表

    # 增加列
    alter table table_name add field_name type 约束;
    
    # 删除列
    alter table table_name drop field_name;
    
    # 修改列类型和约束
    alter table table_name modify field_name type 约束;
    
    # 修改列名
    alter table table_name change old_field_name new_field_name type 约束;
    
    # 修改表名
    rename table old_table_name to new_table_name;
    
    # 修改表字符集
    alter table table_name character set 字符集; 
    

DML

  1. 插入记录

    insert into table_name (field_name1, field_name2, ...) values (value1, value1, ...);
    insert into table_name values (value1, value1, ...);
    insert into table_name (field_name1, field_name2, ...) select field_name1, field_name2, ... from table_name;
    insert into table_name select * from table_name;
    
    # 示例
    insert into test (`name`, dept, age, nick) values ('张三', '电商项目部', 28, '张三丰');
    
  2. 删除记录

    delete from table_name;
    delete from table_name where ...;
    
    # 示例
    delete from test where id = 1;
    
  3. 修改记录

    update table_name set field_name1 = vaule1, field_name2 = vaule2, ... ;
    update table_name set field_name1 = vaule1, field_name2 = vaule2, ... where ...;
    
    # 示例
    update test set `name` = '李四', nick = '李四娃' where id = 2;
    

    Aleyson爱逼逼

DQL

  1. 查询记录

    select * from table_name;
    
    # 示例
    select * from test;
    

    Aleyson爱逼逼

  2. 常用聚合函数

    Aleyson爱逼逼

    # count——返回查询的记录总数
    select count(0) from test;
    
    # sum——求和
    select sum(age) from test;
    
    # length——计算字符串长度
    select length(nick) from test where `name` = '张三';
    
    # concat——合并多个字符串
    select concat(`name`, ': ', dept) from test;
    
    
    

    更多的集合函数使用可以查看——菜鸟教程:www.runoob.com/mysql/mysql…

  3. 分组

    select dept from test group by dept;
    

    Aleyson爱逼逼

    select group_concat(name), dept from test group by dept;
    

    Aleyson爱逼逼

  4. 排序

    # 默认是 asc 正序
    select * from test order by id;
    
    select * from test order by id desc;
    
  5. 分页

    # limit 不属于sql92标准,其常与 order by一起使用
    select * from test order by id limit 0, 1;
    

    Aleyson爱逼逼

    # offset 偏移量
    select * from test limit 1 offset 2;
    

    Aleyson安逼逼

  6. 子查询

    # 子查询允许把一个查询嵌套在另一个查询当中,一般放在 select中、from 后、where 中。
    
  7. like

    select * from test where `name` like '李%';
    

    Aleyson爱逼逼

  8. having

    select group_concat(`name`) name, length(group_concat(`name`)) namelen, dept from test group by dept having length(`name`) > 7;
    

    Aleyson爱逼逼

  9. union

    select * from test where `name` = '张三' union select * from test where age = 36;
    

    Aleyson爱逼逼

DCL

  1. mysql安装 - 常用命令

数据类型

数值类型

类型大小范围(有符号)范围(无符号)用途Java数据类型
TINYINT1 byte(-128,127)(0,255)小整数值java.lang.Integer
SMALLINT2 bytes(-32 768,32 767)(0,65 535)大整数值java.lang.Integer
MEDIUMINT3 bytes(-8 388 608,8 388 607)(0,16 777 215)大整数值java.lang.Integer
INT或INTEGER4 bytes(-2 147 483 648,2 147 483 647)(0,4 294 967 295)大整数值java.lang.Long
BIGINT8 bytes(-9,223,372,036,854,775,808,9 223 372 036 854 775 807)(0,18 446 744 073 709 551 615)极大整数值java.math.BigInteger
FLOAT4 bytes(-3.402 823 466 E+38,-1.175 494 351 E-38),0,(1.175 494 351 E-38,3.402 823 466 351 E+38)0,(1.175 494 351 E-38,3.402 823 466 E+38)单精度 浮点数值java.lang.Float
DOUBLE8 bytes(-1.797 693 134 862 315 7 E+308,-2.225 073 858 507 201 4 E-308),0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)0,(2.225 073 858 507 201 4 E-308,1.797 693 134 862 315 7 E+308)双精度 浮点数值java.lang.Double
DECIMAL对DECIMAL(M,D) ,如果M>D,为M+2否则为D+2依赖于M和D的值依赖于M和D的值小数值java.math.BigDecimal

日期类型

类型大小( bytes)范围格式用途Java数据类型
DATE31000-01-01/9999-12-31YYYY-MM-DD日期值java.sql.Date
TIME3'-838:59:59'/'838:59:59'HH:MM:SS时间值或持续时间java.sql.Time
YEAR11901/2155YYYY年份值java.sql.Date
DATETIME81000-01-01 00:00:00/9999-12-31 23:59:59YYYY-MM-DD HH:MM:SS混合日期和时间值java.sql.Timestamp
TIMESTAMP41970-01-01 00:00:00/2038结束时间是第 2147483647 秒,北京时间 2038-1-19 11:14:07,格林尼治时间 2038年1月19日 凌晨 03:14:07YYYYMMDD HHMMSS混合日期和时间值,时间戳java.sql.Timestamp

字符类型

类型大小用途Java数据类型
CHAR0-255 bytes定长字符串java.lang.String
VARCHAR0-65535 bytes变长字符串java.lang.String
TINYBLOB0-255 bytes不超过 255 个字符的二进制字符串java.lang.byte[]
TINYTEXT0-255 bytes短文本字符串java.lang.String
BLOB0-65 535 bytes二进制形式的长文本数据java.lang.byte[]
TEXT0-65 535 bytes长文本数据java.lang.String
MEDIUMBLOB0-16 777 215 bytes二进制形式的中等长度文本数据java.lang.byte[]
MEDIUMTEXT0-16 777 215 bytes中等长度文本数据java.lang.String
LONGBLOB0-4 294 967 295 bytes二进制形式的极大文本数据java.lang.byte[]
LONGTEXT0-4 294 967 295 bytes极大文本数据java.lang.String

架构

Aleyson爱逼逼

逻辑结构解析

  1. 连接者

    这个没什么说的,不管什么语言都有 mysql-connector 去连接 mysql 服务端的客户端程序。

  2. 管理服务和工具

    这个是提供给数据库运维工程师或者DBA来操作数据库的入口。例:MySQL Utilities,提供一组命令行工具用于维护和管理 MySQL 服务器;其包括了

    • 管理工具 (克隆、复制、比较、差异、导出、导入)
    • 复制工具 (安装、配置)
    • 一般工具 (磁盘使用情况、冗余索引、搜索元数据)
  3. 连接池

    对客户发起的连接请求鉴权,和连接池的维护,以及内存的管理。

  4. sql接口

    接收 数据定义语言、数据操作语言、存储过程和触发器等 sql 语言。

  5. sql解析器

    sql解析器其内部包含了两个模块,其一:词法分析(作用是将整个查询分解为多个元素);其二:语法规则(寻找sql语法规则组合,产生一个序列,执行这些规则相关的代码)。当写的sql错误而报错就是这个模块抛出的异常。

    词法分析将sql语句拆成一个一个的元素,语法规则通过mysql定义的语法规则生成对应的数据结构,存储在 thd->lex 对象中。

    select `name`, dept from test where age > 18;
    

    Aleyson爱逼逼

  6. sql优化器

    sql优化器根据 thd->lex 对象的数据结构,优化后生成执行计划。例:使用最优的一个索引,小表关联大表,where条件从左到右找过滤力度最大的优先执行。

  7. sql缓存

    以map的形式将sql查询的结果存储起来,key为将sql哈希后的值。

  8. 存储引擎

    mysql的存储引擎是对表使用的,我们常用的mysql存储引擎就是innodb和myisam。

    • 各种存储引擎介绍

      存储引擎名称介绍
      myisam不支持事务,不支持行锁;插入和查询速度快
      innodb从mysql5.6开始默认的存储引擎,支持事务,支持行锁,支持外键,速度略逊于myisam
      memory内存储存引擎,插入、查询、更新速度超级快,但是数据存储在内存中;一是不安全,二是内存占用率与数据量大小成线性增长
      isammyiasm的前身
      merge将多个表联合成一个表使用,适用于超大规模数据的存储
      archive将数据压缩后存储,适合于存储数据量大的历史数据,仅支持插入和查询
      cvs基于svc数据格式进行存储
      falcon新的存储引擎,支持事务处理,据说是innodb的替换者
    • innodb和myisam的对比

      区别innodbmyisam
      存储文件.frm 表定义文件;.ibd 数据文件和索引文件.frm 表定义文件;.myd 数据文件;.myi 索引文件
      表锁、行锁表锁
      事务支持不支持
      CRDU读、写读多
      count扫表专门存储的地方 (加where也扫表)
      索引结构B+ TreeB+ Tree
      外键支持不支持

物理结构解析

日志文件与数据文件的作用不一样;日志文件采用顺序IO方式存储(记录速度快,只能追加,浪费空间),而数据文件采用随机IO方式存储(记录相对慢,省空间);数据文件是对数据和索引的存储;两者都存放在 /var/lib/mysql 目录下

  1. 日志文件

    # 查看日志开启情况
    show variables like 'log_%';
    
    • 错误日志

      记录mysql server的启动和关闭的日志信息,以及错误和警告信息

    • 二进制日志

      binlog

    • 通用日志

    • 慢查询日志

      这个需要我们手动设置开启

    • 重做日志

      redo.log

    • 回滚日志

      undo.log

    • 中继日志

      relay.log

  2. 数据文件

    # 查看数据文件
    show variables like '%datadir%';
    

    Aleyson爱逼逼

    • .frm文件

      主要存放与表相关的信息,表的定义

    • .ibd文件

      使用独享表空间来存储表数据索引信息,一张表对应一个ibd文件

    • ibdata文件

      使用共享表空间存储表数据索引信息,所有的表共同使用或者多个ibd文件

      Aleyson爱逼逼

SQL执行顺序

Aleyson爱逼逼

select distinct <select_list> from <left_table> <join_type> join <right_table> on <join_condition> where <where_condition> group by <group_by_list> having <having_condition> order by <order_by_condition> limit <limit_number>;

-- 行过滤
1 from <left_table>
2 on <join_condition>
3 <join_type> join <right_table> # 第二步和第三步会循环执行
4 where <where_condition> # 第四步会循环执行,多个条件的执行顺序是从左往右的。
5 group by <group_by_list>
6 having <having_condition>
-- 列过滤
7 select # 分组之后才会执行select
8 distinct <select_list>
-- 排序
9 order by <order_by_condition>
-- MySQL附加
10 limit <limit_number> # 前9步都是SQL92标准语法。limit是MySQL的独有语法。

案例

# 商品和商品类别
CREATE TABLE `item` (
	`id`  int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
	`name`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品名称' ,
	`itemclsid`  int(11) NOT NULL COMMENT '商品类别' ,
	`price`  int(3) NOT NULL DEFAULT 0 COMMENT '商品价格' ,
	`description`  varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '商品描述' ,
	PRIMARY KEY (`id`),
	UNIQUE INDEX `index_test` (`name`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
;

CREATE TABLE `itemcls` (
	`id`  int(11) NOT NULL AUTO_INCREMENT COMMENT 'id' ,
	`name`  varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '商品类别名称',
	PRIMARY KEY (`id`),
	UNIQUE INDEX `index_test` (`name`) USING BTREE 
)
ENGINE=InnoDB
DEFAULT CHARACTER SET=utf8 COLLATE=utf8_general_ci
;

insert into item (`name`, itemclsid, price, description)values ("iphone 4", 1, 6499, "苹果划时代产品");
insert into item (`name`, itemclsid, price, description)values ("iphone 12", 1, 6899, "苹果首部5G手机");
insert into item (`name`, itemclsid, price, description)values ("华为mate20", 1, 4399, "华为商务机");
insert into item (`name`, itemclsid, price, description)values ("华为p20", 1, 4899, "华为拍照手机");
insert into item (`name`, itemclsid, price, description)values ("万象保温杯", 2, 199, "不锈钢保温杯");
insert into item (`name`, itemclsid, price, description)values ("万象玻璃杯", 2, 230, "高硅玻璃杯");

insert into itemcls(`name`) values ("手机");
insert into itemcls(`name`) values ("杯子");
  1. from(产生虚拟表-virtual_table_1)

    select * from item, itemcls; # 产生笛卡尔积
    

    Aleyson爱逼逼

  2. on(处理virtual_table_1笛卡尔积,产生virtual_table_2)

    select * from item a, itemcls b where a.itemclsid = b.id;# 消除笛卡尔积
    
    # 等价于
    select * from item a inner join itemcls b on a.itemclsid = b.id;
    

    Aleyson爱逼逼

  3. join(处理virtual_table_2,将外部列添加入virtual_table_2,产生virtual_table_3)

    # 首先得再插入两条数据,才可看出区别
    insert into item (`name`, itemclsid, price, description)values ("晨光马克笔", 4, 3, "最好用得马克笔");
    insert into itemcls(`name`) values ("日用品");
    
    # left join(左外连接,添加外部列)
    select * from item a left join itemcls b on a.itemclsid = b.id;
    

    Aleyson爱逼逼

    # right join (右外连接,添加外部列)
    select * from item a right join itemcls b on a.itemclsid = b.id;
    

    Aleyson爱逼逼

    # inner join(内连接,不存在外部列)
    select * from item a inner join itemcls b on a.itemclsid = b.id;
    

    Aleyson爱逼逼

    # out join
    select * from item a left outer join itemcls b on a.itemclsid = b.id;
    select * from item a right outer join itemcls b on a.itemclsid = b.id;
    
  4. where(处理virtual_table_3不匹配条件得行,产生virtual_table_4)

    # 条件过滤
    select * from item a left join itemcls b on a.itemclsid = b.id where price > 1;
    

    Aleyson爱逼逼

  5. group by(对virtual_table_4得数据分组,产生virtual_table_5)

    select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.price;
    
    # MySQL 5.7.5及以上功能依赖检测功能。如果启用了 ONLY_FULL_GROUP_BY SQL模式(默认情况下),MySQL将拒绝选择列表,HAVING条件或ORDER BY列表的查询引用在GROUP BY子句中既未命名的非集合列,也不在功能上依赖于它们
    

    Aleyson爱逼逼

    select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name`;
    

    Aleyson爱逼逼

  6. having(对virtual_table_5过滤,产生virtual_table_6)

    select * from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%';
    

    Aleyson爱逼逼

  7. select(对virtual_table_6进行一些函数处理,生成virtual_table_6.1)

    select a.`name`, a.price * 0.75, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%';
    

    Aleyson爱逼逼

  8. distinct(对virtual_table_6.1进行重复过滤,生成virtual_table_6.2)

    select distinct a.`name`, a.price * 0.75, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%';
    

    Aleyson爱逼逼

  9. order by(对virtual_table_6.2进行排序,生成virtual_table_7)

    select distinct a.`name`, a.price * 0.75 newprice, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%' order by newprice;
    

    Aleyson爱逼逼

  10. limit(从virtual_table_7中选出指定得行)

    select distinct a.`name`, a.price * 0.75 newprice, a.description, b.`name` from item a left join itemcls b on a.itemclsid = b.id where a.price > 1 group by a.`name` having a.`name` like 'iphone%' order by newprice limit 1;
    

    Aleyson爱逼逼

mysql 安装

卸载

#### yum安装方式卸载
#1.查看已安装的mysql
rpm -qa | grep -i mysql
yum repolist all | grep mysql

#2.卸载mysql
yum remove -y mysql mysql-libs mysql-common 

#3.删除mysql下的数据文件
rm -rf /var/lib/mysql

#4.删除mysql配置文件 
rm /etc/my.cnf 

#5.删除组件
yum remove -y  mysql-community-release-el6-5.noarch 

安装

#下载rpm文件 
wget http://dev.mysql.com/get/mysql57-community-release-el7-8.noarch.rpm

#执行rpm源文件 
rpm -ivh mysql57-community-release-el7-8.noarch.rpm

#执行安装文件
yum install mysql-community-server 
#在执行yum命令时可能出现以下错误
/var/run/yum.pid 已被锁定,PID 为 3489 的另一个程序正在运行
执行 rm -f /var/run/yum.pid 即可解决

启动

systemctl start mysqld

#启动的时候报错
SELinux is preventing /usr/sbin/mysqld from associate access on the shared memory Unknown.

vim /etc/selinux/config
#将SELINUX=enforcing改为SELINUX=disabled
reboot

常用命令

# 需要在linux中先查询出初始化密码才能登陆进mysql操作
grep password /var/log/mysqld.log 
mysql -uroot -p

# 修改密码策略
set global validate_password_policy=0;

# 修改密码长度
set global validate_password_length=1;

# 修改root用户密码
set password for 'root'@'localhost' = password('123456');

# MySQL远程连接授权 
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123456' WITH GRANT OPTION; 

# 刷新权限
FLUSH PRIVILEGES;

# 查看用户
select user from mysql.user;

后续

索引innodb事务优化集群分库分表 将在后续该系列文章中展示