mysql 的使用与sql 优化
安装:rpm -ivh rpm软件名称
如果安装时 与某个软件 xxx冲突,则需要将冲突的软件卸载掉:
安装时 有日志提示我们可以修改密码:/user/bin/mysqladmin -u root password 'new-password'
注意:如果提示“GPG keys....”安装失败,解决方案:rpm -ivh rpm软件名称 --force --nodoeps
验证:mysqladmin --version
启动mysql应用:service mysql start
关闭: service mysql stop
重启:service mysql restart
在计算机reboot后,登录MySQL:mysql
可能会报错: "/var/lib/mysql/mysql.sock不存在"
-- 原因:是Mysql服务没有启动
解决:启动服务:1.每次使用前 手动启动服务 I/etc/init.d/mysql start
2. 开机自启 chkconfig mysql on , chkconfig mysql off
检查开机是否自动启动:ntsysv
给mysql的超级管理员root 增加密码:/user/bin/mysqladmin -u root password root
登录:
mysql -u root -p
数据库存放目录:
ps -ef|grep mysql 可以看到:
数据库目录:datadir=/var/lib/mysql
pid文件目录:--pid-file=/var/lib/mysql/bigdata01.pid
MySQL核心目录:
/var/lib/mysql:mysql安装目录
/usr/share/mysql:配置文件
/usr/bin :命令目录(mysqladmin ,mysqldump 等命令)
/etc/init.d/mysql: mtsql启停脚本
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
默认端口3306
mysql字符编码:
sql : show variables like 'char':
可以发现部分编码是 latin,需要统一设置为utf-8
设置编码:
vi /etc/my.cnf:
[mysql]
default-character-set=utf-8
[mysql]
default-character-set=utf-8
[mysqld]
character_set_server=utf-8
character_set_client=utf-8
collation_server=utf8_general_ci
重启Mysql: service mysql restart
sql :show variables like '%char%';
注意事项:修改编码 只对 “之后” 创建的数据库生效,因此 我们建议 在mysql安装完毕后,第一时间统一编码。
mysql:清屏 Ctrl+L , system clear
2.原理
MTSQL逻辑分厂
InnoDB(默认) :事务优先(适合高并发操作;行锁)
MYISAM:性能优先(表锁)
查询数据库引擎:支持哪些引擎? 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优化
原因:性能低、执行时间长、等待时间长、SQL语句欠佳(连接查询)、索引失效、服务器参数设置不合理(缓冲、线程数)
a. SQL :
编写过程:select dinstinct ... from ...join ..on ...where ... group by .... having ....order by ... limit ...
解析过程:from ..on .. join .. where .... group by .... having .... select ... order by limit ...
b. SQL优化, 主要就是 在优化索引
索引:相当于书的目录
索引:index是帮助MYSQL高效获取数据的数据结构。索引是数据结构(树:B树(默认)、hash树......)
备注(详细查询顺序和解析顺序):https://www.cnblogs.com/annsshadow/p/5037667.html
索引的弊端:
1.索引本身很大,可以存放在内存/硬盘(通常为 硬盘)
2.索引不是所有情况均适用:a. 少量数据 b.频繁更新的字段 c.很少使用的字段
3.索引会降低增删改的效率(增删改 查)
优势:1.提高查询的效率(降低IO 使用率)
2.降低CPU使用率(... order by age desc,因为B树索引 本身就是一个 好排序的结构,因此在排序时 可以直接使用 )
另: 3层Btree可以放上百万条数据。Btree:一般是指B+,数据全部存放在叶节点中。 B+树中查询任意数据次数:n次(B+树的高度)
4.索引
分类:
主键索引:不能重复。id 不能为null
单值索引:单例,age:一个表可以躲过单值索引,name。
唯一索引:不能重复。id 可以为null
复合索引:多个列构成的索引(相当于 二级目录: z:zhao)(name,age)
创建索引:
方式一:
create 索引类型 索引名 on 表(字段)
单值:
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);
注意:如果一个字段是primary key ,则改字段默认就是 主键索引
删除索引:
drop index 索引名 on 表名;
drop index name_index on tb;
查询索引:
show index from 表名;
show index from 表名 \G
5.SQL 性能问题
a.分析SQL 的执行计划:explain ,可以模拟SQL 优化器执行SQL 语句,从而让开发人员知道自己编写的SQL状况
b.MySQL查询优化其会干扰我们的优化
优化方法,官网:https://dev.mysql.com/doc/refman/5.6/en/optimization.html
查询执行计划:explain + SQL 语句
explain select * from tb;
id : 编号
select_type: 查询类型
table:表
type :类型
possible_keys:预测用到的索引
key: 实际使用的索引
key_len:实际使用索引的长度
ref: 表之间的引用
rows:通过索引查询到的数据量 20
Extra: 额外的信息
表的执行顺序 因数量的个数改变而改变的原因:笛卡尔积
数据小的表 优先查询;
id 值不同:id 值越大越优先查询。
(2)select_type:
PRIMARY:包含子查询SQL中的 主查询(最外层)
SUBQUERY:包含子查询SQL 中子查询(非最外层)
simple:简单查询(不包含子查询、union)
derived:衍生查询(使用到了领时表)
(3)type:索引类型、类型
system>const>eq_ref>ref>range>index>all ,要对type进行优化的前提:有索引
其中: system 、const 只是理想情况:实际能达到ref>range
system(忽略):只有一条数据的系统表; 或 衍生表只有一条数据的主查询