您的位置:首页 > 编程语言 > PHP开发

《PHP MySQL和WEB开发》笔记第十二章 MYSQL高级管理 (上)

2017-10-11 15:38 351 查看
直接用CSDN来写笔记吧,更方便!

12.1深入了解权限系统

以管理员身份登录后 mysql -u root -p

输入psw

use mysql;

show tables;



其中,保存权限信息的6个表为 user,host(没找到),db,tables_priv,columns_priv,proce(过程)_priv。这些表也被称为授权表。包含:范围字段和权限字段。

(疑点1:没找到host表,google了一下没看懂,https://stackoverflow.com/questions/9083408/fatal-error-cant-open-and-lock-privilege-tables-table-mysql-host-doesnt-ex,估计是是什么时候更新的时候去掉了?)

user+host确定用户是否可以链接数据库服务器;

db+host 确定用户可以访问哪些数据库;

tables_priv确定用户可以访问哪些表

columns_priv哪些列

procs_priv哪些过程

(疑点2:经过测试发现原来通过grant的用户lustudy_web应该是只能登录lustudy才对,但是他可以登录其他的空的数据库,并且可以在里面建立表格,不能创建数据库,不能登录不为空的数据库,没找到答案)

12.1.1user表

user表中的权限都是全局的,普通用户应当都为N

12.1.2

db表和host表

普通用户的权限储存在db表和host表中

db表确定哪些用户可以访问哪些主机和哪些数据库

host表是db表的补充,貌似是如果一个用户从多个地方访问的话,db表将不会列出他的主机名,

经过测试,主机名会一直储存在db表中,数据库版本为5.6

12.1.3

tables_priv and columns_priv and procs_priv 储存对其的权限,其中表的权限这样赋值:

grant update on lustudy.books to lustudy_test identified by '123456';

赋给某个用户修改某一列的权限这样赋值:

grant update(author) on lustudy.books to lustudy_test identified by '123456';

12.1.4访问控制:mysql如何使用grant 表

(1)链接验证,通过user表

(2)请求验证:先检查user表 如果权限不够 再检查db表,如果权限还不够那么在检查table_priv表 以此类推

系统管理员权限最大,检查到user表就可以了,然后是一个数据库的管理员,然后是一个表的管理员,一个列的管理员,一个过程管理员

当我们知道这些表的意思的时候就可以手动更改这些权限了,但是mysql不知道我们已经更改了这些权限,需要使用语句

flush privileges;

或者在系统中 

mysqladmin flush-privileges;

或者

mysqladmin reload;

或者在下次再连接数据库的时候,mysql会重新检查权限。、

12.2提高数据库的安全性,

12.2.1从操作系统的角度来保护mysql

(1)创建一个专门用于运行mysqld的特定mysql用户;

(2)建立只能由mysql用户访问的目录

(3)mysql应
bce3
当位于防火墙的后面,mysql的默认端口号为3306

12.2.2密码

所有的用户都要有密码

如果要把密码放在php脚本中,必须要把这个脚本放在目录以外的地方,并且只有指定的用户可以读取。

不要以纯文本的形式保存密码,密码应当经过sha1()函数加密。

12.2.3用户权限

(1)不要给任何用户不必要的权限

(2)值得特别注意的权限不要给别人

process:可以观察用户正在做什么,输入了什么包括密码

file:可以读写操作系统中的文件

shutdown:’

reload:

grant:避免他分享自己的权限给其他用户

(3)使用grant的时候应该避免使用通配符,最好是以ip的形式区分用户

可以启动后台程序 --skip=name=resolve来加强(所有主机列的值必须为IP地址或者本地主机)

(4)防止非管理员用户访问web服务器中的mysqladmin程序

12.2.4WEB问题

(1)专门建立一个网络链接用户来访问数据库

(2)利用addslashes和stripslashes函数

(3)有些人能通过修改表单的url来进入脚本,应当检查stripslashesh and addslashes 的大小。

如果用户储存的用户名和密码需要保存在数据库中,请注意如果不使用ssl secure sockets layer 加密套接字层  ,会以纯文本的方式从浏览器传递到服务器,比较危险。

12.3或缺更多关于数据库的信息

利用show

show databases;

show tables;

show tables from books;

show columns from books;

show columns from books from lustudy;=show columns from lustudy.books;

熟练应用小数点和from

现在已知的可以show (databases,tables,columns,grants,index,privileges,还可以显示创建库、表的语句)

show还可以使用where和like语句来判断

show columns from lustudy.books like '%s%';



进阶show:

show index from books:显示此表的索引

show status:给出系统项的信息

show variables:显示系统变量

show processlist:显示进程

show privileges:显示权限

show engines:显示默认存储引擎

show warning:显示上一个任何错误、警告、提示

show errors:显示错误信息

12.3.2使用describe语句

describe只能用于table

describe lustudy.books=show columns from lustudy.books

12.3.3使用explain语句

explain lustudy.books=describe lustudy.books=show columns from lustudy.books尼玛。。三个意思一样的

explain可以解释并执行查询

EXPLAIN语句解释查询我草这么复杂的么。

没搞懂explain select 的意义是什么,得到这些东西可以得出什么信息呢?本段摘抄为主:

explain select 会得到几张表,这些表的字段如下:

id:select查询语句的ID号

select_type:所使用的查询类型

tables:用来完成查询所需要的表

type:解释了查询在关联中是如何使用的

possible_key:可能用来链接表的关键字

key:是mysql实际使用的表的关键字或者为null

key_len:关键字的长度

ref:用来从表中选择列所必须使用的关键字

rows:粗略的列出执行链接锁必须扫描的每个表的行数

extra:链接是如何执行的

select type的值:

1.simple:简单的select 没有union和嵌套查询,join on的也是simple

2.primary:一个需要union操作或者含有子查询的select,位于最外层的单位查询的select_type即为primary。且只有一个。但是值得注意的是使用了in的除外。使用了in的类型为materialized

3.union:联合中的第二个或者后一个查询,貌似中间的也是union。

4.dependend union:联合中的第二个或者后一个查询,根据主查询而定(不知道怎么样会出来这个)

5.union result:union查询的结果

6.subquery:内部子查询

7.dependent subquery:内部子查询,根据关联而定(也就是说一个关联子查询)

8.derived:在from中使用了子查询

9.uncacheable subquery:一个结果无法缓存的子查询,必须重新查看每一行

10.uncacheablue union :一个union中的下一个或者第二个select属于uncacheable subquery

11.materialized:具体化,被物化的子查询

type:列出了查询在关联中是怎么用的

感谢:http://www.cnblogs.com/xiaoboluo768/p/5400990.html

依次从好到差:system,const,eq_ref,ref,fulltext,ref_or_null,unique_subquery,index_subquery,range,index_merge,index,ALL,除了all之外,其他的type都可以使用到索引,除了index_merge之外,其他的type只可以用到一个索引

1.const:只从该表读取一次,非系统表,使用唯一索引或者主键,返回记录一定是1行记录的等值where条件时,通常type是const。其他数据库也叫做唯一索引扫描

2.system:系统表

3.eq_ref:对来自关联中其他表的每组行,从改表中读取一行。使用条件是:结合使用了该表索引所有部分,而该索引是unique或主键。

另一个解释:出现在要连接这个表的查询计划中,驱动表只返回一行数据,且这行数据是第二个表的主键或者唯一索引。

4.ref:关联只使用的关键字一部分,该关键字不是unique或主键。总之,返回数据不唯一的等值查找就可能出现。

5.fulltext:使用fulltext索引执行了关联。

6.ref_or_null:类似于一个ref查询,但是mysql也查询null的行。(例如在子查询中)

7.unique_subquery:用于where中使用in子查询,子查询返回不重复的唯一值。

8.index_subquery:类似于unique_subquery,但是用作索引的非唯一子查询。

9.range:索引范围扫描

10index_merge:特定的优化用于INDEX_MERGE

11.index:扫描整个索引

12.all:表中的每一行都将被索引

ROWS列列出了粗略的执行链接所必须扫描的每个表的行数。rows相乘就是粗略的行数。

.

.

.key_len列给出了使用了的关键词的长度,可以用它来判断是否只使用了关键词的一部分。

ref列显示了:从表中选择列而必须用与关键字一起使用的列。

extra列显示的是链接如何执行的,以及其他所有的信息。

extra:(可以有多个)

1.distinct:找到第一个匹配行后,停止查找

2.not exist:查询已经使用joinleft优化

3.range checked for each record:对连接中的其他表的集合中的每一行,试图找到最佳索引

4.using filesort:要经过两个步骤才能分类数据,显然比较长

5.using index:表中的所有信息来自索引,也就是说并没有搜索行

6.using join buffer:将联合缓冲器写入段

7.using temporary:要执行该查询需要一个临时表

8.using where:选择行时使用where语句

对于explain中出现的问题,可以使用以下方法来解决:

(1)检查列类型并且确认他们相通

(2)修改列类型使其匹配

(3)让关联优化器来检查关键字的分布,使用myisamchk或者analyze table语句对关联进行优化

myisamchk

myisamchk先没有看。228页。

(4)添加新的索引,

(5)如果possible_key中包含一些null值,可能需要对该表添加一个索引来提高查询性能。

alter table books add index isbn;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: