mysql优化

2019-10-04  本文已影响0人  guideEmotion

一 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

引擎

show engines 支持哪些引擎

show variables like '%storage_engine%'; 看你的mysql当前默认的存储引擎:

show create table 表名;你要看某个表用了什么引擎(在显示结果里参数engine后面的就表示该表当前用的存储引擎):

三 索引必看

MySQL索引原理及设计
MySQL索引总结

四 explain

image.png

id

select查询的序列号,包含一组数字,表示查询中执行select子句或操作表的顺序

image.png
id如果相同,可以认为是一组,从上往下顺序执行;在所有组中,id值越大,优先级越高,越执行

select_type

查询的类型,主要是用于区别普通查询、联合查询、子查询的复杂查询

image.png

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中

  1. is null、is not null、<>、!=都会使用索引.一般为range或ref级别
  2. or也会用到索引,就是range级别(对一个属性使用会or,感觉和范围查询差不多,对复合索引中的多个属性使用or不会使用索引。)

like中使用覆盖索引

image.png
其实还是没用到索引,只是用了索引树来查询,快一点(index级别)。

七 order和索引

image.png

备注

这里记得不是很全,可以和尚硅谷的mysql高级资料配合使用

参考

  1. https://www.jb51.net/article/155350.htm
上一篇下一篇

猜你喜欢

热点阅读