mysql优化
一 linux环境安装mysql
下载地址:https://dev.mysql.com/downloads/file/?id=487404
安装教程:https://www.cnblogs.com/xxoome/p/5864912.html
增加密码
# 进入mysql安装目录
./bin/mysqladmin -u root password 123456
查看数据存放目录
ps -ef|grep mysql
数据库目录:datadir
pid文件目录:--pid-file
安装目录
1、 数据库目录
/var/lib/mysql/
2、 配置文件
/usr/share/mysql(mysql.server命令及配置文件)
3、 相关命令
/usr/bin(mysqladmin mysqldump等命令)
4、 启动脚本
/etc/rc.d/init.d/(启动脚本文件mysql的目录)
二 原理
分层
MySQL逻辑分层.png注意:SQL优化器
我们写的sql并不一定是真正执行
的sql
引擎
- InnoDB 事务优先,(适合高并发操作,行锁)
- MyISAM 性能优先(表锁)
show engines
支持哪些引擎
show variables like '%storage_engine%';
看你的mysql当前默认的存储引擎:
show create table 表名;
你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):
三 索引必看
四 explain
image.pngid
select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序
id如果相同,可以
认为是一组
,从上往下
顺序执行;在所有组中,id值越大
,优先级越高
,越先
执行
select_type
查询的类型,主要是用于区别普通查询、联合查询、子查询等
的复杂查询
type
system>const>eq_ref>ref>range>index>ALL
eq_ref
读取本表中和关联表表中的每行组合成的一行。除 了 system 和 const 类型之外, 这是最好的联接类型。当连接使用索引的所有部分时, 索引是主键
或唯一非 NULL
索引时, 将使用该值
。
eq_ref 可用于使用 = 运算符比较的索引列。比较值可以是常量或使用此表之前读取的表中的列的表达式。在下面的示例中, MySQL 可以使用 eq_ref 连接(join)ref_table来处理:
explain select u.cust_name,s.id from cst_customer u inner JOIN schools s on u.cust_name = s.user_name;
image.png
possible_keys
显示可能应用在这张表中的索引,一个或多个。
查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询实际使用
key
实际使用的索引。如果为NULL,则没有使用索引
四 单表优化
编写过程和解析过程
image.png我们需要根据解析过程来设计索引(
select在最后面
,所以他用到的字段不能是复合索引的起始字段)
小结
因为最佳左前缀原则
,我们将容易索引失效的字段放在复合索引的后面
五 多表优化
小表驱动大表
image.png以上两个for循环,最终都会循环3000次;但是对于双层循环来说:一般建议, 将数据小的循环放外层;数据大的循环放内层
image.png
六 索引失效
image.png上面的错误纠正(重要)
在mysql5.7中
-
is null、is not null、<>、!=
都会使用索引.一般为range或ref
级别 - or也会用到索引,就是
range
级别(对一个属性使用会or,感觉和范围查询差不多,对复合索引中的多个属性使用or不会使用索引。)
like中使用覆盖索引
image.png其实还是没用到索引,只是用了索引树来查询,快一点(
index
级别)。
七 order和索引
image.png备注
这里记得不是很全,可以和尚硅谷的mysql高级资料配合使用