MySql高级

MySql高级
1 MYSQL用户管理
修改密码
方法1: 用SET PASSWORD命令
首先登录MySQL。
格式:mysql> set password for 用户名@localhost = password('新密码');
例子:mysql> set password for root@localhost = password('123');
方法2:用mysqladmin
格式:mysqladmin -u用户名 -p旧密码 password 新密码
例子:mysqladmin -uroot -p123456 password 123
方法3:用UPDATE直接编辑user表
首先登录MySQL。
mysql> use mysql;
mysql> update user set password=password('123') where user='root'
and host='localhost';
mysql> flush privileges;
方法4:在忘记root密码的时候,可以这样
以windows为例:
1. 关闭正在运行的MySQL服务。
2. 打开DOS窗口,转到mysql\bin目录。
3. 输入mysqld --skip-grant-tables 回车。--skip-grant-tables 的意思是启动MySQL
服务的时候跳过权限表认证。
4. 再开一个DOS窗口(因为刚才那个DOS窗口已经不能动了),转到mysql\bin目录。
5. 输入mysql回车,如果成功,将出现MySQL提示符 >。
6. 连接权限数据库: use mysql; 。
7. 改密码:update user set password=password("123")
8. where user="root";(别忘了最后加分号) 。
9. 刷新权限(必须步骤):flush privileges; 。
10. 退出 quit。
11. 注销系统,再进入,使用用户名root和刚才设置的新密码123登录。
删除MySQL
1、双击安装包,点击下一步,然后点击remove。卸载。
2、手动删除Program Files中的MySQL目录。
3、手动删除ProgramData目录(这个目录是隐藏的。)中的MySQL。
1.1 创建用户
创建用户
create user zhang3 identified by '123123';
表示创建名称为zhang3的用户,密码设为123123;
1.2 了解User表
查看用户
select host,user,password,select_priv,insert_priv,drop_priv from mysql.user;
select * from user\G;
将 user 中的数据以行的形式显示出来(针对列很长的表可以采用这个方法 )

host : 表示连接类型
% 表示所有远程通过 TCP方式的连接
IP 地址 如 (192.168.1.2,127.0.0.1) 通过制定ip地址进行的TCP方式的连接
机器名 通过制定i网络中的机器名进行的TCP方式的连接
::1 IPv6的本地ip地址 等同于IPv4的 127.0.0.1
localhost 本地方式通过命令行方式的连接 ,比如mysql -u xxx -p 123xxx 方式的连接。
User:表示用户名
同一用户通过不同方式链接的权限是不一样的。
password : 密码
所有密码串通过 password(明文字符串) 生成的密文字符串。加密算法为MYSQLSHA1 ,不可逆 。
mysql 5.7 的密码保存到 authentication_string 字段中不再使用password 字段。
select_priv , insert_priv等
为该用户所拥有的权限。
1.3 设置密码
修改当前用户的密码:
set password =password('123456')
修改某个用户的密码:
update mysql.user set password=password('123456') where user='li4';
flush privileges; #所有通过user表的修改,必须用该命令才能生效。
1.4 修改用户
修改用户名:
update mysql.user set user='li4' where user='wang5';
flush privileges; #所有通过user表的修改,必须用该命令才能生效。

1.5 删除用户
drop user li4 ;

2 权限管理
2.1 授予权限
授权命令:
grant 权限1,权限2,…权限n on 数据库名称.表名称 to 用户名@用户地址 identified by ‘连接口令’;
该权限如果发现没有该用户,则会直接新建一个用户。
比如
grant select,insert,delete,drop on cqmdb.* to li4@localhost ;
#给li4用户用本地命令行方式下,授予cqmdb这个库下的所有表的插删改查的权限。
grant all privileges on *.* to joe@'%' identified by '123';
#授予通过网络方式登录的的joe用户 ,对所有库所有表的全部权限,密码设为123.
就算 all privileges 了所有权限,grant_priv 权限也只有 root 才能拥有。
给 root 赋连接口令 grant all privileges on *.* to root@'%' ;后新建的连接没有密码,需要设置密码才能远程连接。
update user set password=password('root') where user='root' and host='%';
2.2 收回权限
授权命令:
revoke 权限1,权限2,…权限n on 数据库名称.表名称 from 用户名@用户地址 ;
REVOKE ALL PRIVILEGES ON mysql.* FROM joe@localhost;
#若赋的全库的表就 收回全库全表的所有权限
REVOKE select,insert,update,delete ON mysql.* FROM joe@localhost;
#收回mysql库下的所有表的插删改查权限
对比赋予权限的方法。
必须用户重新登录后才能生效
2.3 查看权限
查看当前用户权限
show grants;
查看某用户的全局权限
select * from user ;
查看某用户的某库的权限
select * from db;
查看某用户的某个表的权限
select * from tables_priv;
2.4 通过工具远程访问
1、先 ping 一下数据库服务器的ip 地址确认网络畅通。
2、关闭数据库服务的防火墙
service iptables stop
3、 确认Mysql中已经有可以通过远程登录的账户
select * from mysql.user where user='li4' and host='%';
如果没有用户,先执行如下命令:
grant all privileges on *.* to li4@'%' identified by '123123';
4、测试连接:

3 mysql的一些杂项配置
3.1 大小写问题
SHOW VARIABLES LIKE '%lower_case_table_names%'

windows系统默认大小写不敏感,但是linux系统是大小写敏感的
默认为0,大小写敏感。
设置1,大小写不敏感。创建的表,数据库都是以小写形式存放在磁盘上,
对于sql语句都是转换为小写对表和DB进行查找。
设置2,创建的表和DB依据语句上格式存放,凡是查找都是转换为小
写进行。
设置变量常采用 set lower_case_table_names = 1; 的方式,
但此变量是只读权限,所以需要在配置文件中改。
当想设置为大小写不敏感时,要在my.cnf这个配置文件 [mysqld] 中加入
lower_case_table_names = 1 ,然后重启服务器。
但是要在重启数据库实例之前就需要将原来的数据库和表转换为小写,
否则更改后将找不到数据库名。
在进行数据库参数设置之前,需要掌握这个参数带来的影响,
切不可盲目设置。
3.2 sql_mode
MySQL的sql_mode合理设置
sql_mode是个很容易被忽视的变量,默认值是空值,在这种
设置下是可以允许一些非法操作的,比如允许一些非法数据
的插入。在生产环境必须将这个值设置为严格模式,所以开发、
测试环境的数据库也必须要设置,这样在开发测试阶段就可以发现问题。

使用 set sql_mode=ONLY_FULL_GROUP_BY; 的方式设置会将之前的设置覆盖掉
同时设置多个限制:set sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO';
sql_mode常用值如下:
ONLY_FULL_GROUP_BY:
对于GROUP BY聚合操作,如果在SELECT中的列,没有在GROUP BY
中出现,那么这个SQL是不合法的,因为列不在GROUP BY从句中
NO_AUTO_VALUE_ON_ZERO:
该值影响自增长列的插入。默认设置下,插入0或NULL代表生成下
一个自增长值。如果用户 希望插入的值为0,而该列又是自增长的,
那么这个选项就有用了。
STRICT_TRANS_TABLES:
在该模式下,如果一个值不能插入到一个事务表中,则中断当前的
操作,对非事务表不做限制
NO_ZERO_IN_DATE:
在严格模式下,不允许日期和月份为零
NO_ZERO_DATE:
设置该值,mysql数据库不允许插入零日期,插入零日期会抛出错误
而不是警告。
ERROR_FOR_DIVISION_BY_ZERO:
在INSERT或UPDATE过程中,如果数据被零除,则产生错误而非警告。
如果未给出该模式,那么数据被零除时MySQL返回NULL
NO_AUTO_CREATE_USER:
禁止GRANT创建密码为空的用户
NO_ENGINE_SUBSTITUTION:
如果需要的存储引擎被禁用或未编译,那么抛出错误。不设置此值时,
用默认的存储引擎替代,并抛出一个异常
PIPES_AS_CONCAT:
将"||"视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,
也和字符串的拼接函数Concat相类似
ANSI_QUOTES:
启用ANSI_QUOTES后,不能用双引号来引用字符串,因为它被解
释为识别符
ORACLE:
设置等同:PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE, NO_KEY_OPTIONS, NO_TABLE_OPTIONS, NO_FIELD_OPTIONS, NO_AUTO_CREATE_USER.
4 Mysql逻辑架构
4.1 总体概览
和其它数据库相比,MySQL有点与众不同,它的架构可以
在多种不同场景中应用并发挥良好作用。主要体现在存储引擎的
架构上,
插件式的存储引擎架构将查询处理和其它的系统任务以及数据
的存储提取相分离。这种架构可以根据业务的需求和实际需要选
择合适的存储引擎。

1.连接层
最上层是一些客户端和连接服务,包含本地sock通信和大多数基于
客户端/服务端工具实现的类似于tcp/ip的通信。主要完成一些类似
于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,
为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL
的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操
作权限。
2.服务层
2.1 Management Serveices & Utilities: 系统管理和控制工具
2.2 SQL Interface: SQL接口
接受用户的SQL命令,并且返回用户需要查询的结果。比如select from就
是调用SQL Interface
2.3 Parser: 解析器
SQL命令传递到解析器的时候会被解析器验证和解析。
2.4 Optimizer: 查询优化器。
SQL语句在查询之前会使用查询优化器对查询进行优化。
用一个例子就可以理解: select uid,name from user where gender= 1;
优化器来决定先投影还是先过滤。
2.5 Cache和Buffer: 查询缓存。
如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据。
这个缓存机制是由一系列小缓存组成的。比如表缓存,记录缓存,
key缓存,权限缓存等
缓存是负责读,缓冲负责写。
3.引擎层
存储引擎层,存储引擎真正的负责了MySQL中数据的存储和提取,服
务器通过API与存储引擎进行通信。不同的存储引擎具有的功能不同,
这样我们可以根据自己的实际需要进行选取。
后面介绍MyISAM和InnoDB
4.存储层
数据存储层,主要是将数据存储在运行于裸设备的文件系统之上,
并完成与存储引擎的交互。
5 Mysql存储引擎
5.1 查看命令
1 如何用命令查看
#看你的mysql现在已提供什么存储引擎:
mysql> show engines;

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

5.2 各个引擎简介
1、InnoDB存储引擎
InnoDB是MySQL的默认事务型引擎,它被设计用来处理大量的
短期(short-lived)事务。除非有非常特别的原因需要使用其他的存储
引擎,否则应该优先考虑InnoDB引擎。行级锁,适合高并发情况
2、MyISAM存储引擎
MyISAM提供了大量的特性,包括全文索引、压缩、空间函数(GIS)等,
但MyISAM不支持事务和行级锁(myisam改表时会将整个表全锁住),
有一个毫无疑问的缺陷就是崩溃后无法安全恢复。
3、Archive引擎
Archive存储引擎只支持INSERT和SELECT操作,在MySQL5.1之前不
支持索引。
Archive表适合日志和数据采集类应用。适合低访问量大数据等情况。
根据英文的测试结论来看,Archive表比MyISAM表要小大约75%,比支
持事务处理的InnoDB表小大约83%。
4、Blackhole引擎
Blackhole引擎没有实现任何存储机制,它会丢弃所有插入的数据,不
做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制
数据到备库,或者简单地记录到日志。但这种应用方式会碰到很多
问题,因此并不推荐。
5、CSV引擎
CSV引擎可以将普通的CSV文件作为MySQL的表来处理,但不支持索引。
CSV引擎可以作为一种数据交换的机制,非常有用。
CSV存储的数据直接可以在操作系统里,用文本编辑器,或者excel读取。
6、Memory引擎
如果需要快速地访问数据,并且这些数据不会被修改,重启
以后丢失也没有关系,那么使用Memory表是非常有用。Memory
表至少比MyISAM表要快一个数量级。(使用专业的内存数据库更
快,如redis)
7、Federated引擎
Federated引擎是访问其他MySQL服务器的一个代理,尽管该引
擎看起来提供了一种很好的跨服务器的灵活性,但也经常带来问
题,因此默认是禁用的。
5.2.1 MyISAM和InnoDB


innodb 索引 使用 B+TREE myisam 索引使用 b-tree
innodb 主键为聚簇索引,基于聚簇索引的增删改查效率非常高。
6 索引优化分析
性能下降SQL慢,执行时间长,等待时间长
查询数据过多
能不能拆,条件过滤尽量少
关联了太多的表,太多 Join
join 原理。用 A 表的每一条数据 扫描 B表的所有数据。所以尽量先过滤。
没有利用到索引
单值
复合
条件多时,可以建共同索引(混合索引)。混合索引一般会偶先使用。
有些情况下,就算有索引具体执行时也不会被使 用。
服务器调优及各个参数设置(缓冲、线程数等)
7 手写跟机读
7.1 手写

7.2 机读
随着Mysql版本的更新换代,其优化器也在不断的升级,优化
器会分析不同执行顺序产生的性能消耗不同而动态调整执行顺序。
下面是经常出现的查询顺序:


8 七种join


1 A、B两表共有
select * from t_emp a inner join t_dept b on a.deptId = b.id;
2 A、B两表共有+A的独有
select * from t_emp a left join t_dept b on a.deptId = b.id;
3 A、B两表共有+B的独有
select * from t_emp a right join t_dept b on a.deptId = b.id;
4 A的独有
select * from t_emp a left join t_dept b on a.deptId = b.id where b.id is null;
5 B的独有
select * from t_emp a right join t_dept b on a.deptId = b.id where a.deptId is null;
6 AB全有
#MySQL Full Join的实现 因为MySQL不支持FULL JOIN,下面是替代方法
#left join + union(可去除重复数据)+ right join
SELECT * FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id
UNION
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id
这里因为要联合的缘故,不能考虑到小表驱动大表的情况。只能用right join。要保证查询出来的数字要一致。
7 A的独有+B的独有
* FROM t_emp A LEFT JOIN t_dept B ON A.deptId = B.id WHERE B.`id` IS NULL
UNION
SELECT * FROM t_emp A RIGHT JOIN t_dept B ON A.deptId = B.id WHERE A.`deptId` IS NULL;
9 索引
9.1 是什么
MYSQL官方对索引的定义为:索引( Index)是帮助mysql高效获取数
据的数据结构。
可以得到索引的本质:索引是数据结构。
索引的目的在于提高查询效率,可以类比字典,
如果要查“mysql”这个单词,我们肯定需要定位到m字母,
然后从下往下找到y字母,再找到剩下的sql。
如果没有索引,那么你可能需要a----z
你可以简单理解为“排好序的快速查找数据结构
在数据之外,数据库系统还维护着满足特定查找算法的数据结构,
这些数据结构以某种方式引用(指向)数据,
这样就可以在这些数据结构上实现高级查找算法。这种数据
结构,就是索引。下图就是一种可能的索引方式示例:

最低0.47元/天 解锁文章
3万+

被折叠的 条评论
为什么被折叠?



