要点:
1、MySQL的API
2、MySQL的相关文件
3、MySQL的权限体系
1、MySQL的API 应用程序接口 (application program interface)
1.1 命令行中的 “mysql -e” shell-->mysql:在命令行中执行SQL语句
1.2 跟php的接口应用 mysql_connect()
<?php
$link=mysql_connect('127.0.0.1','root','123');
if ($link)
echo "Connection OK!";
else
echo "Connection failed!";
?>
1.2.1 修改所有php页面的mysql_connect()函数
1.2.2 访问install.php 安装库、表
1.2.3 导入数据
[root@localhost html]# mysql -u root -p123 -h localhost class < fangyuan.sql
2、MySQL的文件
配置文件(参数文件) /etc/my.cnf
[root@localhost html]# mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf
socket: 用于本机链接本机 启动MySQL服务后才会有socket
pid文件:
/var/run/mysqld/mysql.pid
mysql的表结构文件:
*.frm 在/var/lib/mysql/库/*.frm
innodb表相关文件:
ibdata1 系统表空间:数据、回滚段等
ib_logfile0 ib_logfile1 innodb表特有的日志文件
日志:
错误日志:
mysql> show variables like "log_error";
+---------------+---------------------+
| Variable_name | Value |
+---------------+---------------------+
| log_error | /var/log/mysqld.log |
+---------------+---------------------+
1 row in set (0.00 sec)
二进制日志 binlog
记录对MySQL的所有更新的、插入的操作。对数据的修改的操作(增删改操作)
作用: 恢复数据;MySQL复制 ab复制 master slave
通用查询日志:建议保持默认值---OFF
对MySQL所有增删改查都会记录到该日志中。(建议不修改,保持默认即可)
mysql> show variables like "%general%";
+------------------+----------------------------+
| Variable_name | Value |
+------------------+----------------------------+
| general_log | OFF |
| general_log_file | /var/run/mysqld/mysqld.log |
+------------------+----------------------------+
2 rows in set (0.00 sec)
mysql> set global general_log=on; //全局修改,对所有的会话(链接)都生效;、session 会话级别,只当前链接生效
Query OK, 0 rows affected (0.02 sec)
慢查询日志: 优化SQL select多, sql SQL性能
默认关闭的。开启后会记录那些超过指定时间的SQL语句,默认10s。
mysql> show variables like "%slow%";
+---------------------+---------------------------------+
| Variable_name | Value |
+---------------------+---------------------------------+
| log_slow_queries | OFF |
| slow_launch_time | 2 |
| slow_query_log | OFF |
| slow_query_log_file | /var/run/mysqld/mysqld-slow.log |
+---------------------+---------------------------------+
4 rows in set (0.00 sec)
mysql> set global slow_query_log=on;
Query OK, 0 rows affected (0.01 sec)
mysql> set global long_query_time=5; //慢查询的超时间修改
Query OK, 0 rows affected (0.00 sec)
mysql> set session long_query_time=5;
Query OK, 0 rows affected (0.01 sec)
mysql> show variables like "long_query_time";
+-----------------+----------+
| Variable_name | Value |
+-----------------+----------+
| long_query_time | 5.000000 |
+-----------------+----------+
1 row in set (0.00 sec)
mysqld.log mysqld.pid mysqld-slow.log
[root@localhost mysqld]# tailf mysqld-slow.log
/usr/libexec/mysqld, Version: 5.1.73 (Source distribution). started with:
Tcp port: 3306 Unix socket: /var/lib/mysql/mysql.sock
Time Id Command Argument
# Time: 170815 11:31:37
# User@Host: root[root] @ localhost []
# Query_time: 7.005514 Lock_time: 0.000000 Rows_sent: 1 Rows_examined: 0
SET timestamp=1502767897;
select sleep(7);
[root@localhost mysqld]# mysqldumpslow mysqld-slow.log //分析统计
Reading mysql slow query log from mysqld-slow.log
Count: 1 Time=7.01s (7s) Lock=0.00s (0s) Rows=1.0 (1), root[root]@localhost
select sleep(N)
3、MySQL权限体系
权限管理:安全。
服务器: 用户名、密码、来自哪里(访问方IP地址)
cliet: 用户名、密码、登陆那台MySQL服务器(-h serverIP)
添加用户:
mysql>create user 'danny'@'192.168.19.251' identified by '123';
或 mysql>create user "danny"@"192.168.19.251" identified by '123';
登录mysql:
[root@localhost mysql]# mysql -u danny -p123 -h 192.168.19.251
设置(修改)密码:
mysql> set password for cjk@localhost = password('123');
Query OK, 0 rows affected (0.00 sec)
删除用户:
mysql> drop user tom@localhost;
Query OK, 0 rows affected (0.00 sec)
查看
mysql> select user,host,password from mysql.user;
mysql> select user,host,password from mysql.user\G
权限
赋权:
使用create创建的用户只有一个登陆权限(usage),裸权限
查看用户权限:
mysql> show grants for danny@192.168.19.251;
+-------------------------------------------------------------------------------------------------------------------------+
| Grants for danny@192.168.19.251 |
+-------------------------------------------------------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'danny'@'192.168.19.251' IDENTIFIED BY PASSWORD '*23AE809DDACAF96AF0FD78ED04B6A265E05AA257' |
+-------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
添加用户+密码+赋权 ---> grant
mysql> grant all on *.* to danny@13.1.1.5;(已有用户赋权)
mysql> grant all on *.* to wangtao@localhost identified by '123';(赋权同时创建用户)
权限类别:
GRANT OPTION 将被赋予的权限赋予别人
USAGE 裸权限,只能登陆系统,用create user 创建的用户默认裸权限
ALL 所有权限,但除了grant option
REPLICATION SLAVE MySQL主从复制架构用的 master binlog slave
权限回收:
mysql> revoke all privileges ,grant option on *.* from wangtao@localhost; //收回权限
mysql> grant select on *.* to "wang"@"localhost" identified by '123'; //赋予select权限并设置密码
mysql> grant select on *.* to "wang"@"localhost"; //赋予select权限
创建用户 设置密码 赋予权限 删除用户 收回权限
授予权限的粒度:
*.* 所有库中的所有表 全局权限 让用户对MySQL中所有库所有表具有xxx权限
DB1.* DB1库中所有的表 数据库 让用户对某个库中所有的表具有xxx权限
DB1.T1 表中所有列的权限 表级别 让用户对某个表有xxx权限
T1(id) 列权限 列级别 让用户对某个表的某列具有xxx权限
mysql> grant select on DB1.T2 to "chenglong"@"localhost" identified by '123';
mysql> grant all on DB1.T1 to "chenglong"@"%";
ROOT密码忘记解决办法:
1、关闭MySQL 进入配置文件,增加
[mysqld]
skip-grant-tables //跳过权限表认证
[mysqld_safe]
2、登陆MySQL
#mysql 回车
3、执行sql
update mysql.user set password=password('123456') where user="root" and host="localhost";
update mysql.user set password=password('xxx') where user="root" and host=192.168.1.1;
flush privileges //刷新权限
4、退出mysql,并删除配置文件汇总的skip那行
权限修改核实生效:
grant -->立刻生效
update msyql.user -->重启系统、或重启MySQL或执行flush privileges生效;
4、索引
SQL dba
作用:快速找到(检索到)指定的行记录。如果没有索引,mysql会遍历整张表,直到找到要查询的记录,这个时间代价太大。
数据结构:
二叉查找树 内存
平衡二叉树
MySQL: B+树索引
设置索引
添加索引:创建表的时候,直接定义哪一个列为索引列
mysql> create table T4 (id int primary key,name char(30));
Query OK, 0 rows affected (0.01 sec)
mysql> desc T4;
+-------+----------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| name | char(30) | YES | | NULL | |
+-------+----------+------+-----+---------+-------+
2 rows in set (0.01 sec)
追加索引:...,没指定过索引列,以后再去加上索引
mysql> alter table DB1.T3 add key ind_id(id);(给id列加上索引,索引名为ind_id)
mysql> alter table DB1.T3 add key id; (索引不使用别名,默认及列名,此处索引名就为id)
给哪个、哪些列加索引:
高选择性的列-->尽量不重复的列值-->id列
查看表中索引的信息
mysql> show index from T3\G
*************************** 1. row ***************************
Table: T3
Non_unique: 1
Key_name: ind_id
Seq_in_index: 1
Column_name: id
Collation: A
Cardinality: 5000000
Sub_part: NULL
Packed: NULL
Null: YES
Index_type: BTREE
Comment:
1 row in set (0.00 sec)
约束:
保证数据完整性
unique 唯一键 如果对某一列加上了唯一属性,列值不能重复 primary key unique
foreign key 外键 innodb(存储支持) 两张表的数据完整性 user order
default 默认 当往字段中插入数据是,如果没给定该列值,列值应为default设置的值
not null 非空 不能为空
mysql> create table t6 (id int(11) primary key unique not null auto_increment, name char(30) not null, xingbie enum("M","F"), key mingzi(name));
mysql> alter table t6 modify xingbie enum("M","F") default "F"; //修改,增加一个default
mysql> insert into t6(name,xingbie) values("xiaowang","M"),("laowang",""); //传递了空值,没有用到default
mysql> insert into t6(name) values("laowang33"); //这种方式可以用到default
二叉查找树
B+ 3层 查找某一行记录3次io 1s 100次io 0.01 0.02~0.03
创建索引 primary key key
alter table T1 add key xxx(id);