CentOS7环境下MySQL踩坑记
1.启动/配置/编码等问题
安装包放在opt目录下
安装:rpm -ivh rpm 软件名
如果安装时,与某个软件 xxx冲突,则需要将冲突的软件卸载掉:
yum -y remove xxx
修改密码:
/usr/bin/mysqladmin -u root password 'new-password'
/usr/bin/mysqladmin -u root -h localhost.localdomain password 'new-password'
验证安装是否成功:mysqladmin --version
[root@localhost opt]# mysqladmin --version
mysqladmin Ver 8.42 Distrib 5.5.60, for Linux on x86_64
启动:service mysql start
关闭:service mysql stop
重启:service mysql restart
重启计算机:reboot
重启计算机后可能出现问题,大多数是没有启动服务。
启动服务,设置开机自启动:chkconfig mysql on
登录MySQL:
mysql -u -root -p
出现错误:
先停止MySQL服务:service mysqld stop
再启动:service mysql start
再登陆就ok了
很诡异,这是目前这次遇到的情况。
查看数据库安装目录: ps -ef|grep mysql
数据存放目录:datadir=/var/lib/mysql
pid文件目录:pid-file=/var/lib/mysql/localhost.localdomain.pid
核心目录:
安装目录:/var/lib/mysql
配置文件:/usr/share/mysql
命令目录:/usr/bin (mysqladmin,mysqldump 等命令)
启停脚本:/etc/init.d/mysql
MysQL配置文件:
my-huge.cnf 高端服务器 1-2G
my-large.cnf 中等规模
my-medium.cnf 一般
my-small.cnf 较小
但是,以上配置文件mysql默认不能识别,默认只能识别 /etc/my.cnf
采用my-huge.cnf:
执行命令:cp /usr/share/mysql/my-huge.cnf /etc/my.cnf
注意:mysql5.5默认配置文件: /etc/my.cnf
mysql5.6默认配置文件: /etc/mysql-default.cnf
mysql字符编码:
登录mysql,模糊查询,执行:show variables like '%char%';
发现部分编码不是utf-8,需要统一设置为utf-8
设置编码:
执行命令:vi /etc/my.cnf
往下拉找到这个[mysql],添加:default-character-set=utf8
再找到[client]:
再找到[mysqld]:
character_set_server=utf8
character_set_client=utf8
collation_server=utf8_general_ci
重启mysql:service mysql restart
再登陆mysql,执行:show variables like '%char%';
注意:修改编码之后只对“之后”创建的数据库生效
同时发现:vi /etc/my.cnf 可以修改密码和默认端口,如下
此外:mysql清屏: ctrl+L 或者 system clear
2.MySQL分层/存储引擎
MySQL逻辑分层:连接层,服务层,引擎层,存储层。
InnoDB(默认):事务优先,使用行锁(一次锁一行数据),适合高并发操作
MyISAM:性能优先,使用表锁(一次锁一张表里的数据)
client端进行select,直接连接连接层,连接层调用服务层的接口,经过SQL优化器优化之后 ,传到引擎层进行选择引擎。
查询数据库引擎:
支持哪些引擎: show engines;
查询当前使用引擎:show variables like '%storage_engine%';
指定数据库对象的引擎:
create table tb(
id int(4) auto_increment,
name varchar(5),
dept varchar(5),
primary key(id)
)ENGINE=MyISAM AUTO_INCREMENT=1 default charset=utf8;
3.SQL解析过程/索引/B树
SQL优化
诱因:性能低、执行时间太长、等待时间太长、SQL语句欠佳(连接查询)、索引失效、服务器参数设置不合理(缓冲区、线程数)
- SQL:
- 编写过程:select dinstinct.. from ..join .. on ..where ..group by .. having .. order by .. limit ..
- 解析过程:from ..on ..join ..where ..group by ...having ..select dinstinct .. order by..limit ..
- SQL 优化,主要就是在优化索引
- 索引:相当于书的目录,关键字为 index ,是帮助MySQL高效获取数据的数据结构,索引是数据结构(树:B树(MySQL默认)、哈希树)。
- 索引优势:提高查询效率(降低IO使用率),降低CPU使用率(..order by age desc,因为B树索引本身就是一个排好序的结构,排序时可以直接使用)
- 索引的弊端:
- 本身很大,可以放在内存/硬盘(通常为硬盘)
- 索引不是所有情况都适用:
- 少量数据;
- 频繁更新的字段;
- 很少使用的字段;
- 索引会降低增删改的效率
- 3层B树可以存放上百万条数据
- B树一般指的是B+树,B+树数据全部存放在叶节点中
- B+树中查询任意的数据次数:n次(B+树的高度)
索引:
分类:
- 单值索引:单列,比如age;一个表可以有多个单值索引,比如name,age
- 唯一索引:不能重复,比如id。
- 复合索引:多个列构成的索引(相当于书的二级目录)
创建索引:
- 方式一:
create 索引类型 索引名 on 表(字段)
以前文创建的tb表为例子:
创建单值索引:create index dept_index on tb(dept);
创建唯一索引:create unique index name_index on tb(name);
复合索引:create index dept_name_index on tb(dept,name);
- 方式二: alter table 表名 索引类型 索引名(字段)
单值索引:alter table tb add index dept_index(dept);
创建唯一索引:alter table tb add unique index name_index(name);
复合索引:alter table tb add index dept_name_index(dept,name);
外此不需要commit,因为这些都是DDL语句,会自动提交
注意:
如果一个字段是primary key,则该字段默认就是主键索引;
主键索引不能是null,唯一索引可以是null。
删除索引:drop index 索引名 on 表名;
drop index name_index on tb;
查询索引:
show index from 表名;
show index from 表名\G
4.SQL性能问题
- 分析SQL的执行计划:explain ,可以模拟SQL优化器执行SQL语句,从而让开发人员知道自己编写的SQL执行状况;
- MySQL查询优化器会干扰用户的优化
官网SQL优化介绍(MySQL5.7):https://dev.mysql.com/doc/refman/5.7/en/optimization.html
查询执行计划:explain + SQL语句
explain select *from tb;
id:编号
select_type:表
table : 表
type :类型
possible_keys : 预测用到的索引
key :实际使用的索引
key_len : 实际使用索引的长度
ref:表之间的作用
rows:通过索引查询到的数量
Extra:额外的信息
准备数据:
create table coures(
cid int(3),
cname varchar(10),
tid int(3)
);
create table teacher(
tid int(3),
tname varchar(20),
tcid int(3)
);
create table teacherCard(
tcid int(3),
tcdesc varchar(200)
);
分别插入数据:
insert into coures values(1,'java',1);
insert into coures values(2,'html',1);
insert into coures values(3,'sql',2);
insert into coures values(4,'web',3);
insert into teacher values(1,'tz',1);
insert into teacher values(2,'tw',2);
insert into teacher values(3,'tl',3);
insert into teacherCard values(1,'tzdesc');
insert into teacherCard values(2,'twdesc');
insert into teacherCard values(3,'tldesc');
查询:课程编号为2或者教师证编号为3的老师信息:
先写出查询语句(三表关联):
select t.* from teacher t , coures c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
加入explain,执行:
explain select t.* from teacher t , coures c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
id:id值相同,从上往下顺序执行,依次执行:teacher、teacherCard、coures表的查询,t3-tc3-c4
执行命令:select * from teacher;
执行命令:select * from teacherCard;
执行命令:select * from coures;
给teacher表增加一些数据:insert into teacher values(4,'ta',4);
依次再增加数据:
insert into teacher values(5,'tb',5);
insert into teacher values(6,'tc',6);
commit;
再次执行:
explain select t.* from teacher t , coures c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
查询效果得到:
查询顺序为:tc3--c4--t6
表的执行顺序,因数量的个数改变而改变的原因:笛卡尔积
所以查询顺序变化的原因是,中间数据量越小越好。
结论:数据小的表,优先查询
结论验证,执行:
delete from coures where cid >2 ;
commit;
再次执行:
explain select t.* from teacher t , coures c, teacherCard tc where t.tid = c.tid and t.tcid = tc.tcid and (c.cid = 2 or tc.tcid = 3);
id值不同:则id值越大越优先查询。(本质:在嵌套子查询时,先查内层,再查外层)
例子,查询教授SQL课程的老师的描述(desc)
执行查询语句:
explain select tc.tcdesc from teacherCard tc, coures c , teacher t where c.tid = t.tid and t.tcid = tc.tcid and c.cname = 'sql' ;
将以上多表查询,转为子查询形式:
explain select tc.tcdesc from teacherCard tc
where tc.tcid = (select t.tcid from teacher t where t.tid = (
select c.tid from coures c where c.cname = 'sql'));
子查询+多表:
explain select t.tname,tc.tcdesc from teacher t, teacherCard tc
where t.tcid = tc.tcid and t.tid = (select c.tid from coures c where cname = 'sql');
id值有相同,又有不同:id值越大越优先,id值相同,从上往下顺序执行。
select_type:
PRIMARY:包含子查询SQL中的主查询(最外层)
SUBQUERY:包含子查询SQL中的子查询(非最外层)
simple:简单查询(不包含子查询、union)
derived:衍生查询(使用到了临时表),触发条件为:
- 在from子查询中只有一张表;
explain select cr.cname from (select *from coures where tid in (1,2)) cr;
- 在from子查询中,如果有table1 union table2,则table1 就是 derived,table2就是union
explain select cr.cname from (select *from coures where tid = 1 union select *from coures where tid = 2) cr;
UNION RESULT :告知开发人员,哪些表之间存在union查询。
未完待续……
CentOS7环境下MySQL踩坑记相关推荐
- centos7环境下MySQL安装教程
Linux centos7环境下MySQL安装教程 作者:随缘相识-(志同道合) 字体:[增加 减小] 类型:转载 时间:2017-03-17 我要评论 这篇文章主要为大家详细介绍了Linux cen ...
- React-Native android在windows下的踩坑记
坑很多,跳之前做好准备.没有VPN的同学请浏览完本文后慎行. 你需要先安装最新版本的node.js(我最后使用的是v4.1.2),前往官网下载>> 注:我win7已经安装过Visual S ...
- node-media-server win环境安装架测试 踩坑记
01 因为老师的项目中需要很多流媒体模块的东西,接触到 Node-Media-Server 这个流媒体服务器,这个国人开发的组件,之前还有SRS也是的.记录一下问题和效果. 本子是win7,之 ...
- CentOS7环境下MySQL定时备份
1.新建备份脚本 vi /home/mysqlbak/mysql_bak.sh填入以下内容: mysql_user="USER" #MySQL备份用户 mysql_password ...
- mysql linux centos7_MySQL在Linux centos7环境下安装教程详解(图)
这篇文章主要为大家详细介绍了Linux centos7环境下MySQL安装教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 Linux centos7环境下安装MySQL步骤的详细介绍 安装My ...
- Spark踩坑记——数据库(Hbase+Mysql)转
转自:http://www.cnblogs.com/xlturing/p/spark.html 前言 在使用Spark Streaming的过程中对于计算产生结果的进行持久化时,我们往往需要操作数据库 ...
- windos下 elasticksearch7.13安装踩坑记
windos下 elasticksearch7.13安装踩坑记 一,环境配置 环境要求 java jdk16下载安装 elasticksearch7.13下载安装 遇到的问题 (待更新) 一,环境配置 ...
- centos7 mysql安装教程_centos7环境下MySQL安装教程
Linux centos7环境下安装MySQL步骤的详细介绍 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执 ...
- linux centos7 mysql_Linux centos7环境下安装MySQL的步骤详解
Linux centos7环境下安装MySQL的步骤详解 安装MySQL mysql 有两个跟windows不同的地方 1).my.ini 保存到/etc/my.ini 2).用户权限,单独用户执行 ...
最新文章
- 甲骨文预言机平台(1)业务流程
- 开源会议系统openmeetings安装
- 什么是G1垃圾回收算法
- Docker 精通之常用命令
- python群发邮件1000人-python读取excel群发邮件(一)
- 快手海外管理层人事动荡,两大市场负责人已离职 疑因业务发展不佳
- SAP License:SAP系统上线后的预收款处理
- [PyTorch] 记录一次PyTorch版本更新
- One Switch 让你的 Mac 也能拥有控制中心
- Luogu 3332 [ZJOI2013]K大数查询
- 分享如何恢复回收站删除文件的办法
- Android studio百度地图之定位到国外
- 一场先进技术与先锋企业碰撞的知识盛宴!弘玑Cyclone『超级自动化的数字内生力量』CXO私享会成功举办
- 苹果联合创始人Steve Wozniak:有点担心苹果的未来
- 获取商品数据 API(商品详情、商品主图)
- 计算机无法播放flash,Windows10系统电脑无法播放Falsh动画的解决方法
- qt android png透明,Qt处理照片实现白色背景转透明
- 优麒麟 配置java_Ubuntu Kylin 优麒麟 安装部署Pentaho
- sdwan不可替代cn2
- 简单了解条形码,二维码的生成
热门文章
- 三菱工控板底层源码_参赛-基于NuTiny-SDK-M451实现三菱PLC通讯板(原理图、PCB源文件、程序源码)...
- 为什么决战平安京显示服务器连接失败,决战!平安京总是显示无法连接网络
- 新来一00后,给我卷崩溃了..
- 最实用的Python基础讲解,带你轻松学完数据类型
- iOS Jenkins + fastlane自动打包,蒲公英上传
- java如何压缩解压图片_Java实现压缩文件与解压缩文件
- 网络安全进阶篇(十一章-5)APP渗透测试篇(上)
- ROS使用教程-关于rosparam
- 1.Web基础与HTTP协议
- ca证书 csr_ca证书csr crt cer