赞
踩
mysql5.5
下载地址:https://dev.mysql.com/downloads/mysql/5.5.html#downloads
检查当前系统是否安装过mysql:
安装mysql服务端(注意提示):
安装mysql客户端
查看MySQL安装时创建的mysql用户和mysql组
mysql服务的启+停
service mysql start
service mysql start
如果报错ERROR! The server quit without updating PID file (/var/lib/mysql/localhost.localdomain.pid).
解决办法:https://www.cnblogs.com/bingco/p/8068243.html
mysql_install_db --datadir=/var/lib/mysql
chown mysql:mysql /var/lib/mysql -R
查看mysql的进程:ps -ef|grep mysql
mysql服务启动后,开始连接
自启动mysql服务
修改配置文件位置
修改字符集和数据存储路径
MySQL的安装位置
SQL执行顺序
手写
机读
总结
Join图-7种JOIN
是什么
MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。可以得到索引的本质:索引是数据结构。
你可以简单理解为“排好序的快速查找数据结构”。
详解(B树)
结论
数据本身之外,数据库还维护着一个满足特定查找算法的数据结构,这些数据结构以某种方式指向数据,这样就可以在这些数据结构的基础上实现高级查找算法,这种数据结构就是索引。
一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储在磁盘上。
**我们平常所说的索引,如果没有特别指明,都是指B树(多路搜索树,并不一定是二叉的)结构组织的索引。**其中聚集索引,次要索引,覆盖索引,复合索引,前缀索引,唯一索引默认的都是使用B+树索引,统称索引。当然,除了B+树这种类型的索引之外,还有哈希索引(hash index)等。
优势
劣势
mysql索引分类
单值索引:即一个索引只包含单个列,一个表可以有多个单列索引
唯一索引:索引列的值必须唯一,但允许有空值
复合索引:即一个索引包含多个列
基本语法
创建:
create [unique] index indexname on mytable(columnname(length));
alter mytable add [unique] index [indexname] on (columnname(length))
删除:drop index [indexname] on mytable;
查看:show index from table_name\G
使用alter命令
mysql索引结构
哪些情况需要创建索引
哪些情况不需要创建索引
MySQL Query Optimizer
MySQL常见瓶颈
Explain
是什么(查看执行计划)
能干嘛
怎么玩
Explain+SQL语句
执行计划包含的信息
各字段解释
id
select_type:
有哪些
查询的类型,主要是用于区别普通查询、联合查询、子查询等的复杂查询
table:显示这一行的数据是关于哪些表的。
type:
访问类型排序
type显示的是访问类型,是较为重要的一个指标,结果值从最好到最坏依次是:
system>const>eq_ref>ref>fulltext>ref_or_null>index_merge>unique_subquery>index_subquery>range>index>All
显示查询使用了何种类型,从最好到最差依此是:
system>const>eq_ref>ref>range>index>All
system:表只有一行记录(等于系统表),这是const类型的特例,平时不会出现,这个也可以忽略不计。
const:表示通过索引一次就找到了,const用于比较primary key或则unique索引。因为只匹配一行数据,所以很快。如将主键置于where列表中,MySQL就能将该查询转换为一个常量。
eq_ref:唯一性索引扫描,对于每个索引键,表中只有一条记录与之匹配。常见于主键或唯一索引扫描。
ref:非唯一性索引扫描,返回匹配某个单独值的所有行。本质上也是一种索引访问,它返回所有匹配某个单独值的行,然而,它可能会找到多个符合条件的行,所以它应该属于查找和扫描的混合体。
range:只检索给定范围的行,使用一个索引来选择行。key列显示使用了哪个索引。一般就是在你的where语句中出现了between、<、>、in等的查询。这种范围扫描索引扫描比全表扫描要好,因为它只需要开始于索引的某一点,而结束于另一点,不会扫描全部索引。
index:Full Index Scan,index与All区别为index类型只遍历索引树。这通常比All快,因为索引文件通常比数据文件小。(也就是说虽然all和index都是读全表,但index是从索引中读取的,而all是从硬盘中读的)
all:Full Table Scan,将遍历全表以找到匹配的行。
一般来说,得保证查询至少达到range级别,最好能达到ref。
possible_keys:显示可能应用在这张表中的索引,一个或多个。查询涉及到的字段上若存在索引,则该索引将被列出。但不一定被查询实际使用。
key:实际使用的索引。如果为NULL,则没有使用索引。查询中若使用了覆盖索引,则该索引仅出现在key列表中,不会出现在possible_keys列表中。(覆盖索引:查询的字段与建立的复合索引的个数一一吻合)
key_len:表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度。在不损失精确性的情况下,长度越短越好。key_len显示的值为索引字段的最大可能长度,并非实际使用长度,即key_len是根据表定义计算而得,不是通过表内检索出的。
ref:显示索引的哪一列被使用了,如果可能的话,是一个常数。哪些列或常量被用于查找索引列上的值。查询中与其它表关联的字段,外键关系建立索引。
rows:根据表统计信息及索引选用情况,大致估算出找到所需的记录所需要读取的行数。
Extra:包含不适合在其他列中显示但十分重要的额外信息。
Using filesort:说明mysql会对数据使用一个外部的索引排序,而不是按照表内的索引顺序进行读取。MySQL中无法利用索引完成的排序操作成为“文件排序”。
Using temporary:使用了临时表保存中间结果,MySQL在对查询结果排序时使用临时表。常见于排序order by和分组查询group by。
Using index:表示相应的select操作中使用了覆盖索引(Covering Index),避免访问了表的数据行,效率不错!如果同时出现using where,表明索引被用来执行索引键值的查找;如果没有同时出现using where,表明索引用来读取数据而非执行查找动作。
覆盖索引:
Using where:表明使用了where过滤。
Using join buffer:使用了连接缓存。
impossible where:where子句的值总是false,不能用来获取任何元组。(查询语句中where的条件不可能被满足,恒为False)
select tables optimized away:在没有GROUPBY子句的情况下,基于索引优化MIN/MAX操作或者对于MyISAM存储引擎优化COUNT(*)操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
distinct:优化distinct操作,在找到第一匹配的元组后即停止找相同值的动作。
热身Case
索引分析
单表
两表
建表SQL
案例
总结:**左连接建右表,右连接建左表。**理由:以左连接为例,左表的信息全都有,所以右表需要查找,所以建立右表index。
三表
建表SQL
案例
总结:Join语句的优化
索引失效(应该避免)
建表SQL
案例(索引失效)
全值匹配我最爱
最佳左前缀法则:
不在索引列上作任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描
存储引擎不能使用索引中范围条件右边的列
尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select *
mysql在使用不等于(!=或者<>)的时候无法使用索引会导致全表扫描
is null,is not null也无法使用索引
like以通配符开头(‘%abc…’)mysql索引失效会变成全表扫描的操作
like%加右边
问题:解决like ‘%字符串%’时索引不被使用的方法?
利用覆盖索引解决两边%的优化问题。
字符串不加单引号索引失效
该问题同问题3,是索引列上做了类型转换!
少用or,用它来连接时会索引失效
小总结
优化总结口诀:
全值匹配我最爱,最左前缀要遵守;
带头大哥不能死,中间兄弟不能断;
索引列上少计算,范围之后全失效;
LIKE百分写最右,覆盖索引不写星;
不等空值还有or,索引失效要少用;
VAR引号不可丢,SQL高级也不难!
面试题讲解
题目SQL
c3的作用在排序而不是查找,用到了但是没有统计在结果中
出现了filesort
只用c1一个字段索引,但是c2、c3用于排序,无filesort
出现了filesort,我们建的索引是1234,它没有按照顺序来,3和2颠倒了
用c1、c2两个字段索引,但是c2、c3用于排序,无filesort
本例有常量c2的情况,因此排序就相当于order by c3,常量,所以没有出现filesort的情况
定值、范围还是排序,一般order by是给个范围
group by基本上都需要进行排序,会有临时表产生
一般性建议
永远小表驱动大表,类似嵌套循环Nested Loop
优化原则:小表驱动大表,即小的数据集驱动大的数据集。
当B表的数据集必须小于A表的数据集时,用in优于exists
当A表的数据集必须小于B表的数据集时,用exists优于in
注意:A表与B表的ID字段应建立索引。
EXISTS
提示
总结
ORDER BY关键字优化
ORDER BY子句,尽量使用Index方式排序,避免使用FileSort方式排序
建表SQL
Case
case1
case2
MySQL支持两种方式的排序
ORDER BY满足两种情况,会使用Index方式排序:
尽可能在索引列上完成排序操作,遵照索引建的最佳最前缀
如果不在索引列上,filesort有两种算法:
mysql就要启动双路排序和单路排序
双路排序
取一批数据,要对磁盘进行了两次扫描,众所周知,I\O是很耗时的,所以在mysql4.1之后,出现了第二种改进的算法,就是单路排序
单路排序
结论及引申出的问题
由于单路是后出的,总体而言好过双路
但是用单路有问题
本来想省一次I/O操作,反而导致了大量的I/O操作,反而得不偿失。(原因:数据的总大小超过sort_buffer的容量)
优化策略
小总结
GROUP BY关键字优化
是什么
怎么玩
说明
查看是否开启及如何开启
默认:SHOW VARIABLES LIKE ‘%slow_query_log%’;
开启:set global slow_query_log=1;
那么开启了慢查询日志后,什么样的SQL才会记录到慢查询日志里面呢
Case
查看当前多少秒算慢:SHOW VARIABLES LIKE ‘long_query_time%’;
设置慢的阈值时间:set global long_query_time=3;
为什么设置后看不出变化(设置3之后,查询依然显示10):
记录慢SQL并后续分析
查询当前系统中有多少条慢查询记录:
show global status like ‘%Slow_queries%’;
配置版
日志分析工具mysqldumpslow
在生产环境中,如果要手工分析日志,查找、分析SQL,显然是个体力活,MySQL提供了日志分析工具mysqldumpslow。
查看mysqldumpslow的帮助信息
工作常用参考
往表里插入1000w数据
建表
设置参数log_bin_trust_function_creators
创建函数,保证每条数据都不同
随机产生字符串
随机产生部门编号
创建存储过程
调用存储过程
dept:
DELIMITER ;
CALL insert_dept(100, 10);
emp:
DELIMITER ;
CALL insert_emp(100001, 500000);
是什么:是mysql提供的可以用来分析当前会话中语句执行的资源消耗情况。可以用于SQL的调优的测量
默认情况下,参数处于关闭状态,并保存最近15次的运行结果
分析步骤
是否支持,看看当前的mysql版本是否支持
开启功能,默认是关闭,使用前需要开启
set profiling = on;
运行SQL
查看结果,show profiles;
诊断SQL,show profile cpu, block io for query [上一步前面的问题SQL数字号码];
参数备注
日常开发需要注意的结论
converting HEAP to MyISAM:查询结果太大,内存都不够用了往磁盘上搬了
Creating tmp table:创建临时表
Copying to tmp table on disk:把内存中临时表复制到磁盘,危险!!
locked
配置启用
编码启用
永远不要在生产环境开启这个功能!
定义
锁是计算机协调多个进程并发访问某一资源的机制。
生活购物
锁的分类
特点:偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。
案例分析
建表SQL
手动增加表锁
查看表上加过的锁
释放表锁
加读锁(我们为mylock表加read锁(读阻塞写例子))
加写锁(我们为mylock表加write锁(MyISAM存储引擎的写阻塞读例子))
案例结论
简而言之,就是读锁会阻塞写,但是不会阻塞读。而写锁则会把读和写都阻塞。
表锁分析
特点
由于行锁支持事务,复习老知识
事务(Transaction)及其ACID属性
并发事务处理带来的问题
更新丢失(Lost Update)
脏读(Dirty Reads)
不可重复读(Non-Repeatable Reads)
幻读(Phantom Reads)
事务隔离级别
案例分析
建表SQL
行锁定基本演示
无索引行锁升级为表锁
间隙锁危害
面试题:常考如何锁定一行
案例结论
行锁分析
如何分析行锁定
通过检查InnoDB_row_lock状态变量来分析系统上的行锁的争夺情况
show status like ‘innodb_row_lock%’;
对各个状态量的说明如下:
对于这5个变量,比较重要的是
优化建议
slave会从master读取binlog来进行数据同步
三步骤+原理图
mysql版本一致且后台以服务运行
主从都配置在[mysqld]结点下,都是小写
主机修改my.ini配置文件
从机修改my.cnf配置文件
因修改过配置文件,请主机+从机都重启后台mysql服务
主机从机都关闭防火墙
在Windows主机上建立账户并授权slave
GRANT REPLICATION SLAVE ON *.* TO 'zhangsan' @ '192.168.14.167【从机数据库IP】' IDENTIFIED BY '123456';
flush privileges;
查询master的状态
show master status
记录下File和Position的值
执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化
在Linux从机上配置需要复制的主机
CHANGE MASTER TO MASTER_HOST='主机IP', MASTER_USER='zhangsan', MASTER_PASSWORD='123456', MASTER_LOG_FILE='file名字', MASTER_LOG_POS=position数字;
eg.
启动从服务器复制功能
show slave status\G【\G是为了以键值的形式显示,好看一些】
下面两个参数都是Yes,则说明主从配置成功!
Slave_IO_Running:Yes
Slave_SQL_Running:Yes
主机新建库、新建表、insert记录,从机复制
如何停止从服务复制功能
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。