mysql基础

Mysql 5.7之后都会有默认的root密码:通过grep "temporary password" /var/log/mysqld.log来找回

文件存储的劣势

    数据冗余的不一致性性

    数据访问困难

    数据孤立

    完整性问题

    原子性问题

    并发访问异常

    安全性问题

DML:数据操作语言

    INSERT

    DELETE

    SELECT

    UPDATE

DDL:数据定义语言

    CREATE

    DROP

    ALTER

DCL:数据控制语言

    GRANT

    REVOKE

RDB对象:库、表、索引、视图、用户、存储过程、存储函数、时间调度器

约束

    域约束:数据类型约束

    外键约束:引用完整性约束

    主键约束:某字段能唯一标识此字段所属的实体,且不为空

    唯一性约束:每一行的某字段都不允许出现相同值,可以为空

        一张表中可以有多个

    检查性约束:不能出现违反常理的类型

    constraint

数据查询和存储

    存储管理器

        权限及完整性管理器

        事务管理器

        文件管理器

        缓冲区管理器

    查询管理器

        dml解释器

        ddl解释器

        dcl解释器

        查询执行引擎

mysql是单进程多线程的模型

    守护线程

    应用线程

关系运算

    投影:只输出指定属性

    选择:只输出符合条件的行

    自然连接:具有相同名字的属性上所有取值相同的行

    笛卡尔积:

        (a+b)*(c+d)=ac+ad+bc+bd

    并:两个表关系相同的部分。集合运算

sql查询语句

    DDL

    DML

    完整性定义语言:ddl的一部分

    视图定义语言

    事务控制语言

    嵌入式sql和动态sql:把sql嵌入到程序语言中叫嵌入式sql;程序设计语言使用函数或者方法和rdbms服务器建立连接并进行交互叫动态sql

    授权:DCL

使用程序设计语言和rdbms交互:

    嵌入式sql:与动态sql相似但是要编译时完全确定下来

        odbc

    动态sql:直接发送的语句

        jdbc

mysql的存储引擎是插件式的

表管理器:负责创建、读取或修改表定义文件;维护表描述符高速缓存;管理表锁

    表结构定义文件

表修改模块:表创建、删除、重命名、地处、更新或插入之类的操作

表维护模块:表的检查、修理、备份、恢复、优化(碎片整理)及解析

文件中记录组织

    堆文件组织:一条记录可以放在文件中任何地方

    顺序文件组织:根据“搜索码”值顺序存放

    散列文件组织:人为的根据哈希值分“桶”

表空间(table space):一个空间放多个表的空间。

数据字典(data dictionary):关系的元数据,比如,关系的名字、字段的名字、字段的类型和长度、视图、约束、用户名字、授权、密码

缓冲区管理器:

    缓冲置换策略

    被钉住的块

mysql启动装载的文件,每次执行都会装载一次,以最后一个配置文件的配置为准(~/.my.cnf)

    1./etc/my.cnf

    2./etc/nysql/my.cnf

    3.$MYSQL_HOME/my.cnf

/path/to/file when defaults-extra-file=/path/to/file is specified

    4.~/.my.cnf

安装完成后会有五个用户

    root

    root@127.0.0.1

    root@localhost

    ''@localhost

    ''@hostname

mysql用户密码修改

    1.#mysqladmin -u USERNAME -p HOSTNAME password 'NEW_PASS' -p 'OLD_PASS'

    2.mysql>SET PASSWORD FOR 'USERNAME'@'HOST'=PASSWORD('new-pass');

    3.mysql>UPDATE mysql.user SET PASSWORD=PASSWORD('new_pass')WHERE CONDITION;

mysql客户端工具:

    mysql

    mysqldump

    mysqladmin

    mysqlcheck

    mysqlimport

mysql非客户端工具

    myisamchk

    myisampack

两大存储引擎

    MyISAM--->表类型,无事务,表锁

        每个表有三个文件

            .frm:表结构

            .MYD:表数据

            .MYI:表索引

    InnoDB--->事务,行锁

        所有表共享一个表空间文件

        建议:每表用一个单独表空间文件

            .frm:表结构

            .ibd:表空间(表数据索引)

客户端命令

\c:提前终止语句执行

\g:无论语句结束符是什么,直接将此语句发送服务器端执行

\G:无论语句结束符是什么,直接将此语句发送服务器端执行,以竖排方式显示

\! COMMAND:执行shell命令

\w:语句执行结束后显示警告信息

\#:对新建的对象,支持名称补全功能

服务器端命令

mysqladmin

    create DATABASE

    dorp DATABASE

    ping

    processlist

    status

        --sleep N:显示频率

        --count N:显示多个状态

    extended--status:显示状态变量

    variables:显示服务器变量

    flush-privileges:让mysqld重读授权表,等同于reload

    flush-status:重置大多数服务器状态变量

    flush-logs:二进制和中继日志滚动

    flush-hosts:重置主机、账户等计数器

    refresh:相当于同时执行flush-hosts和flush-logs

    shutdown:关闭mysql服务器进程

    start-slave:启动复制,启动从服务器复制进程

        SQL thread

        IO thread

    stop-slave:关闭复制

数据类型

数值型

    精确数值

        int

            TINYINT:占用1字节

            SMALLINT:占用2字节

            MEDIUMINT:占用3字节

            INT:占用4字节

            BIGINT:占用8字节

            decimal:1.11之类的精确数值

    近似数值

        float(4 bytes):单精度浮点型

        double(8 bytes):双精度浮点型

        real

字符型

    定长

        char--->255

        BINARY

    变长

        VARBINARY

        varchar(65535-:+1;65535+:+2)--->65535

        varbinary

        text

            TINYTEXT(多占一个字节)--->255

            TEXT(+2)--->65535

            MEDIUMTEXT(+3)--->16777215

            LONGTEXT(+4)--->4294967295

    TINYBLOB--->255(+1)

    MEDIUMBLOB--->16Mb(+4)

    LONGBLOB--->4Gb(+5)

    BLOB--->64Kb(+3)

枚举

    ENUM

集合

    SET

日期时间型

    date(3 bytes)

    time(3 bytes)

    datetime(8 bytes)

    timestamp(4 bytes)

    year(1 bytes)

AUTO_INCERMENT

    整形

    非空

    无符号

    主键或唯一键

MySQL服务器变量

作用域

    全局变量

        SHOW GLOBAL VARIABLES

    会话变量

        SHOW [SESSION]VARIABLES

生效时间

    动态

        可即时生效

        生效方式

            全局:对当前会话无效,只对新建会话有效

            会话:即时生效,但只对当前会话有效

    静态

        不需要重启生效,但是重启会失效。可以写在配置文件中,通过参数传递给mysqld

服务器变量:@@变量名

    显示:select

    设定:set {global|session} 变量名='value'

连接管理器:

    接受请求

    建立安全连接

    创建线程

    认证用户

并发控制:

并发控制依赖的手段

    锁

    时间戳

    多版本和快照隔离

多版本并发控制:MVCC。每个用户执行的都是一个语句的副本,最后合并副本

简单的并发控制依靠锁

    锁:

        读锁:共享锁

        写锁:独占锁(排他锁)

            LOCK TABLES tab_name {READ|WRITE};

            UNLOCK TABLES--->解所有锁

    锁粒度:从大到小,MySQL服务器仅支持表级锁,行锁需要由存储引擎完成。越粗糙越容易管理,越精细越容易实现多个操作的并发性(内部实现的就越复杂)

            表锁:锁定数据表

            页锁:锁定一个数据块

            行锁:锁定一行

    事务(状态:活跃、部分提交(最后一句执行中)、失败的、终止的、提交的):

        RDBMS:ACID(原子性,一致性,隔离性,持久性)

            原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

            一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

            隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

            持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

MyISAM不支持事务,InnoDB支持事务

事务日志(顺序IO。数据文件是随机IO):

    重做日志

        redo log根据日志重复操作

    撤销日志

        undo log每次操作都保留下来,以保证撤销

事务隔离(定义了数据库系统中一个操作的结果在何时以何种方式对其他并发操作可见):

    隔离级别:

        READ UNCOMITTED:未提交读,是最低的隔离级别。允许“脏读”(dirty reads),事务可以看到其他事务“尚未提交”的修改。

        READ COMMITTED:提交读级别,基于锁机制并发控制的DBMS需要对选定对象的写锁一直保持到事务结束,但是读锁在SELECT操作完成后马上释放(因此“不可重复读”现象可能会发生,见下面描述)。和前一种隔离级别一样,也不要求“范围锁”。

        REPATEABLE READ:可重复读隔离级别,基于锁机制并发控制的DBMS需要对选定对象的读锁(read locks)和写锁(write locks)一直保持到事务结束,但不要求“范围锁”,因此可能会发生“幻影读”。--->mysql默认

        SERIABLIZABLE:可串行。在基于锁机制并发控制的DBMS实现可串行化,要求在选定对象上的读锁和写锁保持直到事务结束后才能释放。在SELECT 的查询中使用一个“WHERE”子句来描述一个范围时应该获得一个“范围锁”(range-locks)。这种机制可以避免“幻影读”(phantom reads)现象。

事务调度:

    可恢复调度

    无级联调度

SQL语句

数据库:

    CREATE DATABASE|SCHEMA [IF NOT EXISTS] db_name [CHARACTER SET=字符集] [COLLATE=排序方式]

    ALTER DATABASE|SCHEMA CHARACTER SET=字符集 COLLATE=排序方式

    DROP DATABASE|SCHEMA db_name

表:

    1.直接定义一张空表

    2.从其他表中查询出数据,并创建新表

    3.以其他模板创建一个空表

键也成为约束,可用作索引,属于特殊的索引(有特殊限定):B+TREE的索引结构

DDL(Data Definition Language):

    CREATE

    ALTER

    DROP

    TRUNCATE

    COMMENT

    RENAME

创建表:

    CREATE TABLE [IF NOT EXISTS] tb_name(col_name col_definition,constraint)

创建索引

    CREATE INDEX

    SHOW INDEXS FROM tb_name

单字段:

    PRIMARY KEY

    UNIQUE KEY

单或多字段:

    PRAMARY KEY (col,...)

    UNIQUE KEY (col,...)

    INDEX (col,...)

修改表:

    ALTER TABLE

        添加、删除、修改字段

        添加、删除、修改索引

        修改表名

        修改表属性

删除表:

    DROP TABLE

创建索引(索引只能创建和删除,不能被修改,因为索引是表自动维护的数据结构)

    CREATE INDEX index_name ON tb_name(col,...) USING BTREE;

        col_name[(length)] [ASC 升序|DESC 降序]

删除索引

    DROP INDEX index_name from tb_name;

DML(Data Manipulation Language):

    SELECT

    INSERT

    UPDATE

    DELETE

    MERGE

    CALL

    EXPLAIN PLAN

    LOCK TABLE

SELECT select-list FROM tb WHERE qualification

查询语句类型:

    单表查询

    多表查询

    子查询

单表查询

SELECT * FROM tb_name;

SELECT filed1,filed2 FROM tb_name; 投影

SELECT [DISTINCT相同的值只显示一次] * FROM tb_name WHERE qualification; 选择

FROM子句:要查询的关系。表、多个表、其他的SELECT语句

WHERE子句:布尔关系表达式

=,>,>=,<,<=

逻辑关系。与(AND &&)、或(OR ||)、非(NOT !)关系

ORDER BY field_name{ASC|DESC} 查询后排序

LIMIT [offset偏移了多少个,]count取多少个

聚合函数(分组:GROUP BY)

SUM() 求和

MIN() 最小

MAX() 最大

AVG() 平均值

COUNT() 个数和

GROUP BY:分组

HAVING qualification--->再次过滤

特殊操作符

表示之间的值。BETWEEN...AND...

比较两个值。LIKE ''

%:任意长度任意字符

_:任意单个字符

支持正则表达式。RLIKE ''

在列表中。IN

判断是否为空:IS NULL

判断是否不空:IS NOT NULL

字段别名:AS

多表查询

连接

交叉连接:笛卡尔乘积

自然连接:是一种特殊的等值连接,它要求两个关系进行比较的分量必须是相同的属性组,并且在结果集中将重复属性列去掉。

外连接:

左外连接 ... LEFT JOIN ... ON ...

右外连接 ... RIGHT JOIN ... ON ...

自连接:表的数据连接到表自己中的数据

子查询

比较操作使用子查询:子查询只能返回单值

IN()中使用子查询

FROM中使用子查询

联合查询

... UNION ...

DELETE:

DELETE FROM tb_name WHERE condition;

INSERT INTO:

INSERT INTO ta_name (col1,col2,...) VALUES (val1,val2,...)[,(val1,val2,...),...]

字符型:单引号

数值型:不需要引号

日期时间型:不需要引号

空值:NULL

UPDATE:

UPDATE tb_name SET col1=...,col2=... WHERE

视图:存储下来的SELECT语句

基于基表的查询结果

创建视图

CREATE VIEW

删除视图

DROP VIEW

DCL(Data Control Language):

GRANT

REVOKE

GRANT ALL PRIVIEGES ON [object_type] db.* TO username@'%';

GRANT OPTION(资源使用限定)

MAX_QUERIES_PER_HOUR count--->每小时最大查询次数

MAX_UPDATES_PER_HOUR count--->每小时最大更新次数

MAX_CONNECTIONS_PER_HOUR count--->每小时用户最大连接数

MAX_USER_CONNECTIONS count--->用户最大连接数

REVOKE SELECT ON db.* FROM 'username'@'%';

mysql用户调用查看的六张表

user:用户帐号、全局权限

db:库级别权限

host:已废弃(已经整合到user表)

tables_priv:表级别权限

columns_priv:列级别权限

procs_priv:存储过程和存储函数相关的权限

proxies_priv:代理用户权限

用户帐号:

用户名@主机

用户名:16字符以内

主机:

主机名:www.aaaa.com,mysql

ip地址:172.16.10.177

网络地址:172.16.0.0/255.255.0.0

通配符:172.16.%.%

--skip-name-resolve:略过正解反解名称

权限级别:

全局级别:SUPER

库:

表:DELETE,ALTER,TRIGGER

列:SELECT,INSERT,UPDATE

存储过程和存储函数

创建mysql用户:

CREATE USER username@'%' [IDENTIFIED BY 'password']

INSERT INTO mysql.user;

mysql> FLUSH PRIVILEGES;

删除mysql用户:

DROP USER 'username'@'host';

重命名mysql用户

RENAME USER old_name TO new_name;

TCL(Transaction Control Language):

SAVEPOINT

ROLLBACK

SET TRANSACTION

START TANSACTION:启动事务

COMMIT:提交事务

ROLLBACK:回滚事务

如果没有明确启动事务:

autocommit:能实现自动提交,每一句操作都能直接提交

select @@autocommit

SAVEPOINT:保存点

ROLLBACK TO sid:回滚保存点

SHOW CREATE:查看创建某个对象的时候使用的语句

在shell中可以直接使用mysql -e来调用mysql command

TRUNCATE tb_name:清空表,并重置AUTOINCREMENT计数器;delete语句则会清空表不重置计数器

忘记mysql密码:

启动mysqld_safe时传递两个参数:

--skip-grant-tables

--skip-networking

通过更新授权表的方式直接更改其密码,而后移除两个选项重启服务器

日志

错误日志

mysql选项:

log_error

log_warnings

erver启动和关闭过程的信息

server运行过程中的错误信息

事件调度器运行一个事件时产生的信息

在从服务器上启动从服务器进程时产生的信息

一般查询日志

general_log

general_log_file

log

还可以保存到表中,默认不开启,要手动创建该表

慢查询日志

long_query_time 默认为10秒

log_slow_queries={YES|NO}

slow_query_log 默认关闭

slow_query_log_file 数据目录下的localhost-slow.log

二进制日志:任何引起或可能引起数据库变化的操作(DDL,DML):复制,即时点恢复

mysqlbinlog

--start-datetime 'yyyy-mm-dd hh:mm:ss' 起始时间

--stop-datetime 'yyyy-mm-dd hh:mm:ss' 结束时间

--start-position 起始位置

--stop-position 结束位置

二进制日志的格式

基于语句:statement

基于行:row

混合方式:mixed

二进制日志事件:

产生事件

相对位置

查看当前正在使用的二进制日志文件

mysql> SHOW MASTER STATUS;

查看二进制日志事件

mysql> SHOW BINLOG ENENTS IN 'mysql-bin.000000x' [FROM position];

查看所有二进制日志文件

mysql> SHOW BINARY LOGS;

删除二进制日志

mysql> PURGE BINARY LOGS TO 'mysql-bin.000000x';

二进制日志滚动

mysql> FLUSH LOGS;

中继日志

从主服务器的二进制日志文件中复制而来的事件,并保存为的日志文件

事务日志:保证ACID,将随机IO转换为顺序IO

innodb_flush_log_at_trx_commit

0:每秒同步,并执行磁盘flush操作

1:每事务同步,并执行磁盘flush操作

2:没事务同步,但不执行磁盘flush操作

mysql存储引擎

MyISAM:

不支持事务

表锁

b-tree索引、fulltext索引、空间索引

支持表压缩

InnoDB:

事务

行锁

b-tree索引、聚簇索引、自适应hash索引

表空间,raw磁盘设备

mysql备份

备份内容:

数据

配置文件

二进制日志

事务日志

备份类型

热备:读写不受影响

xtrabackup,mysqldump

温备:能读不能写

冷备:离线备份

物理备份:复制数据文件

速度快

逻辑备份:将数据导出至文本文件中

速度慢、丢失浮点数精度。方便使用文本处理工具直接对其处理、可移植能力强

完全备份:备份全部数据

增量备份:仅备份上次完全备份或增量备份以后变化的数据

差异备份:仅备份上次完全备份以来变化的数据

备份策略:

完全+增量

完全+差异

mysql备份工具:

mysqldump:逻辑备份工具、MyISAM(温)、InnoDB(热)

mysqlhotcopy:物理备份工具、温备

参考文档:

MySQL中的事务与锁:http://zheming.wang/blog/2015/04/23/16301743-802B-4795-B79F-5DB37C7D587B/

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,179评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,229评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,032评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,533评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,531评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,539评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,916评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,813评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,568评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,654评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,354评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,937评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,918评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,152评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,852评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,378评论 2 342

推荐阅读更多精彩内容

  • MYSQL 基础知识 1 MySQL数据库概要 2 简单MySQL环境 3 数据的存储和获取 4 MySQL基本操...
    Kingtester阅读 7,764评论 5 116
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 31,893评论 2 89
  • 一、MySQL架构与历史 A.并发控制 1.共享锁(shared lock,读锁):共享的,相互不阻塞的 2.排他...
    ZyBlog阅读 19,810评论 3 177
  • 今天看到一位朋友写的mysql笔记总结,觉得写的很详细很用心,这里转载一下,供大家参考下,也希望大家能关注他原文地...
    信仰与初衷阅读 4,723评论 0 30
  • 蓦地,一只熊掌突然出现在我眼前奋力摇晃。 “哎哎~发什么呆呀?!你今天怎么总发呆呀!……是不是又看见哪个帅哥了??...
    俐缘阅读 370评论 0 2