以下很多内容来自于网络
用户、权限
创建用户
// host 用户地址,%表示可以远程,localhost表示本地,也可以指定具体IP
create user ‘username’@‘host’ identified by ‘password’;
然后使用grant语句赋予该用户权限
grant all privileges on db.table to ‘username’@‘host’;
还可以直接使用grant创建语句加赋予权限
// with grant option 是将‘赋予用户权限’的权限给该用户,一般不加,加了的话只可以将自己有权限的表grant。
// 只有root有创建用户的权限
grant all privileges on db.table to ‘username’@‘host’ identified by ‘password’ [with grant option];
查看用户权限
show grants for ‘username’@‘host’;
备份
备份主要是使用mysql提供的mysqldump工具,在工作中,我们一般创建一个定时任务,每天备份我们的数据库。
自动备份脚本
#! /bin/bash
DB_USER=“user”
DB_PWD=“pwd”
DB_NAME=“dbname”
BK_DIR="/home/mysql/backup"
BIN_DIR="/usr/local/mysql/bin"
B I N D I R / m y s q l d u m p − − o p t − u BIN_DIR/mysqldump --opt -u BINDIR/mysqldump−−opt−uDB_USER -p$DB_PWD $DB_NAME t_user > B K D I R / BK_DIR/ BKDIR/{DB_NAME}_$(date +%Y%m%d).sql
之后添加定时任务
crontab -e
执行后打开类似Vim的东西,添加需要执行的任务
45 11 * * * /home/mysql/shell/file_name.sh
分钟(0-59) 小时(0-23) 几号(1-31) 月份(1-12) 星期(0-7,0和7都是周日);
*表示任何值;使用“,”隔开多个值;使用"-"表示区间 1-5 表示1,2,3,4,5;
所以上面写的任务表示:每天的11点45分执行后面的sh文件。
explain
使用explain + SQL,字段解释如下:
- id,标识,表示语句执行的优先级,数字越大则越早执行,相同数字,则靠上的早执行;
- select_type,
SIMPLE:简单SELECT(不使用UNION或子查询)
PRIMARY:最外面的SELECT
UNION:UNION中的第二个或后面的SELECT语句
DEPENDENT UNION:UNION中的第二个或后面的SELECT语句,取决于外面的查询
UNION RESULT:UNION 的结果
SUBQUERY:子查询中的第一个SELECT
DEPENDENT SUBQUERY:子查询中的第一个SELECT,取决于外面的查询
DERIVED:导出表的SELECT(FROM子句的子查询) - table,输出行所用的表,为了便于追踪,表的别名最好可以看出来是哪个表。
- type,连接类型,按照最佳到最差排序如下,通常要求最少是range。
ystem:表仅有一行(=系统表)。这是const联接类型的一个特例。
const:表最多有一个匹配行,它将在查询开始时被读取。因为仅有一行,在这行的列值可被优化器剩余部分认 为是常数。const表很快,因为它们只读取一次!
eq_ref:对于每个来自于前面的表的行组合,从该表中读取一行。这可能是最好的联接类型,除了const类型。
ref:对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
ref_or_null:该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
index_merge:该联接类型表示使用了索引合并优化方法。
unique_subquery:该类型替换了下面形式的IN子查询的ref: value IN (SELECT primary_key FROM single_table WHERE some_expr) unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
index_subquery:该联接类型类似于unique_subquery。可以替换IN子查询,但只适合下列形式的子查询中的 非唯一索引: value IN (SELECT key_column FROM single_table WHERE some_expr)
range:只检索给定范围的行,使用一个索引来选择行。
index:该联接类型与ALL相同,除了只有索引树被扫描。这通常比ALL快,因为索引文件通常比数据文件小。
ALL:对于每个来自于先前的表的行组合,进行完整的表扫描。 - possible_keys,这个的意思是可能会使用那些索引,只是可能,不是真实使用。
- key,这个才表示运行中真正使用的索引。
- key_len,索引长度
- ref,索引所在列
- rows,显示mysql认为要遍历的行数。
- filtered,显示了通过条件过滤出的行数的百分比估计值。
- extra,该列包含MySQL解决查询的详细信息。
Distinct: MySQL发现第1个匹配行后,停止为当前的行组合搜索更多的行。
Not exists: MySQL能够对查询进行LEFT JOIN优化,发现1个匹配LEFT JOIN标准的行后,不再为前面的的行组合在该表内检查更多的行。
range checked for each record (index map: #):MySQL没有发现好的可以使用的索引,但发现如果来自前面的表的列值已知,可能部分索引可以使用。
Using filesort: MySQL需要额外的一次传递,以找出如何按排序顺序检索行。
Using index: 从只使用索引树中的信息而不需要进一步搜索读取实际的行来检索表中的列信息。
Using temporary: 为了解决查询,MySQL需要创建一个临时表来容纳结果。
Using where: WHERE 子句用于限制哪一个行匹配下一个表或发送到客户。
Using sort_union(…), Using union(…), Using intersect(…): 这些函数说明如何为index_merge联接类型合并索引扫描。
Using index for group-by: 类似于访问表的Using index方式,Using index for group-by表示MySQL发现了一个索引,可以用来查GROUP BY或DISTINCT查询的所有列,而不要额外搜索硬盘访问实际的表。
mysql调优建议
1、比较运算符尽量用"=",不要用"<>","=“有使用索引的几率
2、明知只有一条查询结果,就使用"limit 1”
3、字段选择合适的数据类型,能用smallint就不用int。
4、使用UNION ALL 代替 UNION,如果结果集允许重复的话
5、同样的查询结果,尽量保持查询语句一致,这样可以使用查询缓存
6、尽量避免使用select *
7、where、join、order by语句字段尽量被索引
8、将大的DELETE,UPDATE or INSERT 查询变成多个小查询
数据库一直是我的弱项,这段时间找工作体现的就更明显了。所以~~努力,加油。
这两篇其实是更像收集的一些笔记,后面会对mysql有比较深入的学习记录。
~ . ~