mysql

指令+數據,PHP:查找算法
排序,二分法,索引,B+樹
搜索碼
ODBC
線程池:用來限制線程個數
DBMS:databases management system

數據的組織結構
層次型
網狀型
關係型

RDBMS:relational databases management system

RDBMS:
1、數據庫創建,刪除
2、創建表,刪除表,修改表
3、索引的創建,刪除
4、用戶和權限
5、數據增、刪、改
6、查詢

DML:data manapulate lanague:數據操作語言
insert,replace,update,delete
DDL:data defination lanauage:數據定義語言
create,alter,drop
DCL:data control language:數據控制語言
grant,revoke

SELECT

RDBMS:
oracle,Sybase,infomix,DB2,SQL server,MySQL,egresql,postgresql,enterpriseDB

MySQL,SQL,MySQL AB
去IOE計劃(IBM,Oracle,EMC)

Oracle,

IBM,
SUN-->MySQL

BEA:weblogic
PepoleSoft

OpenOffice

LibreOffice

MariaDB

MySQL --> Percona

反關係模型:NoSQL
MongoDB
Redis
HBase

DBMS:
數據管理獨立性
有效地完成數據存取
數據完整性和安全性
數據集中管理
開發存儲與故障恢復
減少應用程序開發時間

SQL:ANSI
sql86,sql89,sql92,sql99

DBMS基本組件:提供分析器來判斷語法是否正確,計劃執行器用來分析有多少種方法來執行這個語句,優化器來判斷哪種方法最優,文件的存取方法,要先把數據存取到緩存器,最後使用磁盤空間管理器來決定此數據存在哪個空間裏,以及故障恢復管理器,事物管理器,鎖管理器

www.mysql.com

MySQL:
community Edtion,社區版
Enterprise Edtion,企業版

軟件包格式:
軟件包管理器特有的格式
rpm包,.exe格式
通用二進制格式
源程序

RHEL 5.8 (32bit)
mysql,mysql-server

MySQL的rpm包

LAMP:
MySQL
通用二進制

二進制程序
mysql
-u username
-p
-h mysql_server

-h 127.0.0.1
   Linux:socket
   windows:memory

mysql客戶端:
交互式模式
批處理模式:執行mysql腳本

交互式模式中的命令類別:
客戶端命令
服務器端命令
都必須使用語句結束符,默認爲分號;

SQL接口:
Oracle,PL/SQL
SQL server,T-SQL

用戶:username@host

mysqld

tcp/3306

RDBMS:
/var/lib/mysql/

安裝
yum install mysql-server

初始化:就是建立mysql數據庫

關係數據庫對象:


索引
試圖
約束
存儲過程
存儲函數
觸發器
遊標
用戶
權限
事務

表:
行,列
表:實體
行:row
列:field,column

字段名稱,數據類型,類型修飾(實現限制功能)

字段名稱:

字符,char(n),varchar(n),binary(n),varbinary(n),text(n),blob(n),

數值
精確數值:
整型
tinyint
smallint
medinuint
int
bigint
修飾符:unsigned,無符號
not null
十進制:
decimal
近似數值
浮點型
Float
double

日期時間
data
time
datetime
stamp
布爾

DDL
create
alter
drop
DML
insert
update
delete
DCL
grant
revoke

創建數據庫
create database db_name;
create database if not exists db_name;

  drop database db_name;

創建表
create table tb_name(col1,col2,...);
查看庫中的表:show tables from db_name;
查看錶的結構:desc tb_name;
刪除表:drop table tb_name;
修改表:
alter table tb_name
modify
change
add
drop

DML:
insert into tb_name (col1,col2,...) values|value('string',num,...);
insert into tb_name (col1,col2,...) values|value('string',num,...),('string',num,...);
update tb_name set column=value where
delete from tb_name where condition;

選擇:
select 字段 from tb_name where condition

*: 所有字段
where:沒有條件表示顯示所有行

創建用戶:
create user 'username'@'host' identified by 'password'
drop user 'username'@'host'

jerry@localhost,[email protected]

host:
ip:
hostname:
network:
通配符
:匹配任意單個字符,172.16.0.
%:匹配任意長度字符

  jerry@'%' 

DCL:
grant pri1,pri2,...on db_name.tb_name to 'username'@'host' [identified by 'password']
revoke pri1,pri2,...on db_name.tb_name from 'username'@'host'

查看用戶授權:show grants for 'username'@'host'

all privileges

選擇(只對行操作):指定以某字段做爲搜索碼,做邏輯比較,選符合條件的行
where 指定選擇條件
投影(只對列操作):

INT A=10

CHAR A=10

mysql -u root -p -h 172.16.100.1
ls /var/lib/mysql/

mysql>\h;
mysql>show databases;
mysql>create database testdb;
mysql>create database if not exists testdb;
mysql>drop database testdb;
mysql>use mydb;
mysql>create table students(name char(20) not null,age tintint unsigned,gender char(1) not null);
mysql>show tables;
mysql>desc students;
mysql>alter table students add course varchar(100);
mysql>alter table students change course Course varchar(100) after name;
mysql>alter table students drop course;
mysql>insert into studnets (name,gender) value ('linghuchong','m'),('xiaolongnv','f');
mysql>select from students;
mysql>insert into students values ('xiaoxiangzi','hamagong','57','m');
mysql>update students set course='pixiejianfa';
mysql>update students set course='hamagong' where name='xiaoxiangzi';
mysql>select name,course from students where gender='m';
mysql>delete from students where course='pixiejianfa';
mysql>create user 'jerry'@'%' identified by 'jerry';
mysql>show grants for 'jerry'@'%';
mysql>grant all privileges on mydb.
to 'jerry'@'%';

MySQL
SQL/MySQL
事務,隔離,併發控制,鎖
用戶和權限
監控:status
索引類型:查詢:variables
備份和恢復
複製功能
集羣

文件存儲缺陷:數據冗餘和不一致性,數據訪問困難,數據孤立,完整性問題,原子性問題,併發訪問異常,安全性問題

文件:
表示層:文件
邏輯層:文件系統:存儲引擎
物理層:元數據,數據:數據塊

dbms:層次模型,網狀模型,關係模型
E-R:實體-關係模型

關係模型(結構化數據模型):
關係模型
實體-關係模型
對象關係模型:基於對象的數據模型
半結構化數據模型:xml(擴展標記語言)例如<name>jerry</name>

關係:關係代數運算
交集
並集
差集
全集
補集

SQL(structure query language):結構化查詢語句

70年代
system R:SQL
ingres,oracle,Sybase
ANSI(美國國家標準委員會):ansi-sql

DML:數據操作語言
insert
delete
select
update
DDL:數據定義語言
create
drop
alter
DCL:數據控制語言
grant
revoke
訪問權限

RDB對象:庫,表,索引,視圖,用戶,存儲過程,存儲函數,觸發器,事件調度器

約束:
域約束:數據類型約束
外鍵約束:引用完整性約束
主鍵約束:某字段能唯一標識此字段所屬的實體,並且不允許爲空,一張表只能有一個主鍵
唯一性約束:每一行的某字段都不允許出現相同值,可以爲空,一張表中可以有多個
檢查性約束:age:int

constraint

關係型數據庫:
表示層:表
邏輯表:存儲引擎
物理層:數據文件

數據存儲和查詢:
存儲管理器:權限及完整性管理器,事物管理器,文件管理器,緩衝區管理器
查詢管理器:DML解釋器,DDL解釋器,查詢執行引擎

C/S:協議通信

單進程:
多線程:守護進程,應用線程

thread reuse(線程重用)

32bit:
2.7G
64bit:
smp:對稱多處理器

MySQL --》mariadb--》percona

查詢管理器--》存儲管理器--》磁盤

關係運算:
投影:只輸出指定屬性
選擇:只輸出符合條件的行
自然連接:具有相同名字的屬性上所有取值相同的行
笛卡爾積:(a+b)*(c+d)=ac+ad+bc+db
並:集合運算

SQL查詢語句:
sequel-->SQL
SQL-86
SQL-92
SQL-99
SQL-03
SQL-08

SQL語言的組成部分:
DDL
DML
完整性定義語言:DDL的一部分功能
視圖定義
事物控制
嵌入式SQL和動態SQL
授權:DCL

使用程序設計語言如何跟rdbms交互:
嵌入式SQL:與動態SQL類似,但其語言必須程序編譯時安全確定下來
ODBC
動態SQL:程序設計語言使用函數(mysql_connect())或者方法與rdbms服務器建立連接,並進行交互:通過建立連接向SQL服務器發送查詢語句,並將結果保存至變量中而後進行處理
JDBC

MySQL組成部分
連接管理器--》解析器+緩存器--》優化器--》儲存引擎(MySQL插件式存儲引擎)

用戶連接請求--》連接管理器--》線程管理器--》用戶模塊--》命令分發模塊+緩存模塊+日誌模塊--》解析器--》優化器+表定義模塊+表維護模塊(repair)+狀態報告模塊+複製模塊--》訪問控制模塊--》表管理器--》存儲引擎

MySQL插件式存儲引擎
5.5.8:myisam
5.5.8後:innodb

表管理器:負責創建、讀取或修改表定義文件;維護表描述符高速緩存;管理表鎖;
表結構定義文件

表修改模塊:表創建,刪除,重命名,移除,更新或插入之類的操作
表維護模塊:檢查,修改,備份,恢復,優化(碎片整理)及解析

行:定長,變長

文件中記錄組織:
堆文件組織:一條記錄可以放在文件中的任何地方
順序文件組織:根據“搜索碼”值順序存放
散列文件組織:

表結構定義文件,表數據文件

表空間(table space)

數據字典(data dictionary):
關係的元數據:關係的名字,字段名字,字段的類型和長度,視圖,約束,用戶名字,授權,密碼

緩衝區管理器:
緩存置換策略
被釘住的塊
MySQL -->
MariaDB
Percona

MySQL安裝:
專用軟件包管理器
deb,rpm
rpm:RHEL(oracle Linux),centos,suse
通用二進制格式包
gcc:x86,x64

源代碼:
    5.5,5.6
    cmake

MySQL用戶密碼修改:
1.mysqladmin -u username -h hostname password ‘new_pass’ -p
2.mysql>set password for "username"@"host" =password('new_pass')
3.mysql>update mysql.user set password=password('new_pass') where condition

MySQL安裝:
源碼安裝MySQL
cmake

字符集:
漢字:字符集
GBK
GB2312
GB18030
UTF8

排序規則:

性能分析

安裝MySQL

yum groupinstall "Development Libraries"

tar -zxvf cmake-2.8.8.tar.gz
tar -zxvf mysql-5.5.28.tar.gz
cd cmake-2.8.8
./configure
make
make install

groupadd -r mysql
useradd -r -g mysql -s /sbin/nologin mysql
chown -R mysql.mysql /mydata/data

cd mysql-5.5.28
cmake . -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mydata/data -DSYSCONFDIR=/etc -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_READLINE=1 -DWITH_SSL=system -DWITH_ZLIB=system -DWITH_LIBWRAP=0 -DMYSQL_UNIX_ADDR=/tmp/mysql.sock
make
make install

mysql--》mysqld
unix
mysql --> mysql.sock --> mysqld
windows
mysql --> memory(pipe) --> mysqld

不在同一主機上,基於tcp/ip協議

mysql客戶端工具:
mysql
mysqldump
mysqladmin
mysqlcheck
mysqlimport

[client]

-u username
-h host
-p
--protocol {tcp|socket|pipe|memory}
--port PORT

cd /usr/local/mysql
chown -R :mysql ./
scripts/mysql_install_db --user=mysql --datadir=/mydata/data
cp support-files/my-large.cnf /etc/my.cnf
cp support-files/mysql.server /etc/init.d/mysqld
service mysqld start

vim /etc/profile.d/mysql.sh
export PATH=$PATH:/usr/local/mysql/bin

mysql>show databases;
mysql>show engines;

vim /etc/my.cnf
[mysqld]
datadir=/mydata/data

mysql>drop user ''@localhost;
mysql>use mysql;
mysql>select User,Host,Password from user;
mysql>drop user ''@localhost.localdomain;
mysql>update user set Password=PASSWORD('redhat') where user='root';
mysql>flush privileges;

vim /root/.my.cnf
[client]
user = 'root'
password = 'redhat'
host = 'localhost'

mysql非客戶端工具:
myisamchk
myisapack

myISAM:
每表三個文件:
.frm:表結構
.MYD:表數據
.MYI:表索引
innodb:
所有表共享一個表空間文件
建議:每表一個獨立的表空間文件
.frm:表結構
.ibd:表空間(表數據和表索引)
mysql>show variables like '%innodb%';
vim /etc/my.cnf
[mysqld]
innodb_file_per_table = 1

mysql>create database mydb;
mysql>use mydb;
mysql>create table testdb(id int not null,name char(30));

MySQL插件式存儲引擎:
5.5.8:myisam
5.5.8後:innodb

存儲引擎,也被稱爲表類型:

mysql:myisam
myisam表:無事物,表鎖
.frm:表結構定義文件
.myd:表數據
.myi:索引
innodb表:事物,行鎖
.frm:表結構
.ibd:表空間(數據和索引)

mysql>show engines;
mysql>show table status like ‘[表名]’;

--protocol:
tcp,socket,pipe,memory
程序語言連接數據的方式:
動態SQL:通過函數或方法與數據庫服務建立連接
嵌入式SQL:
JDBC,ODBC

客戶端:mysql,mysqladmin,mysqldump,mysqlimport,mysqlcheck
服務器:mysqld,mysql_safe,mysqld_multi

my.cnf
/etc/my.cnf--》/etc/mysql/my.cnf--》$mysql_home/my.cnf--》--default-extra-file=/path/to/somefile --》~/.my.cnf
[mysqld]
[mysqld_safe]
[client]
host =
[mysql]

mysqld --help --verbose:查看各種指令幫助信息

datadir = /mydata/data
hostname.err:錯誤日誌
1.此前服務未關閉
2.數據初始化失敗
3.數據目錄位置錯誤
4.數據目錄權限問題mysql:myisam

DBA:
開發DBA:數據庫設計,SQL語句,存儲過程,存儲函數,觸發器
管理DBA:安裝,升級,備份,恢復,用戶管理,權限管理,監控,性能分析,基準測試

數據類型:
數值型:精確數值(int),近似數值(float,double,real)
字符型:定長(char(#),binary),變長(varchar(#),varbinary)
text,blob
enum(枚舉),set(集合)
日期時間型:data,time,datatime,timestamp

域屬性,修改符:

數據類型:
1.存入的值類型
2.佔據的存儲空間
3.定義還變長
4.如何比較及排序
5.是否能夠索引

SQL
mysql>show character set;顯示字符集
mysql>show collation;顯示排序規則
mysql>show global variables like ‘%char%’;

mysql>select database();
mysql>select last_insert_id();

auto_increment:必須是×××,非空,無符號,主鍵或唯一鍵
mysql>create table test(id int unsigned auto_increment not null primary key,name char(20));

RRtype ENUM('A','PTR')

SQL模型:
abc,abcdefg
char(3)

MySQL服務器變量:
作用域:分爲兩類:
全局變量:mysql>show global variables like 'sql_mode';
會話變量mysql>show [session] variables like‘sql_mode’;
生效時間:分爲兩類:
可動態調整:可及時修改,能及時生效
可靜態調整:寫在配置文件中,通過參數傳遞給mysqld

動態調整參數的生效方式:
    全局:對當前會話無效,只對新建會話有效
    會話:及時生效,但只對當前會話生效

或者: br/>服務器變量:@@變量名
顯示:select
設定:set global|session 變量名=‘values’
mysql>select @@global.sql_mode;
mysql>select @@session.sql_mode;
mysql>set global sql_mode='strict_all_tables';
mysql>set session sql_mode='strict_trans_tables';

SQL語句:
數據庫

索引
視圖
DML
數據庫:
create database|schema [if not exists] db_name [character set=] [collate=]
alter {database|schema} db_name {character set charset_name|collate cllation_name
drop {database|schema} {if exists} db_name

    mysql>show character set;             mysql>create schema if not exists students character set 'gbk' collate 'gbk_chinese_ci';
    mysql> 

表:
1.直接定義一張空表;
2.從其他表中查詢出數據,並以之創建新表
3.以其他表爲模板創建一個空表

create table [if not exists] tb_name (col_name col_defination,constraint)

mysql>create table tb1(id int unsigned not null auto_increment primary key,name char(20) not null ,age tinyint nou null) engine=engine_name;

mysql>create table tb1(id int unsigned not null auto_increment ,name char(20) not null ,age tinyint nou null,primary key(id),unique key(name),index(age));

鍵也稱作約束,可用作索引,屬於特殊索引(有特殊限定):B+tree

mysql>create table courses(cid tinyint unsigned not null auto_increment primary key,couse varchar(50) not null) engine=myisam;

create>show indexes from tb_name;顯示指定表上的索引

單字段:
primary key
unique key
單或多字段:
primary key(col,...)
unique key(col,...)
index(col,...)

mysql>show table status like 'courese'\G;

mysql>drop table courses;

mysql>insert into courses(course) values('hamagong'),('pixiejianfa'),('kuihuabaodian');

mysql>create table testcourses select * from courses where cid <=2;

mysql>desc testcourses;

mysql>create table test like courses;

修改表定義:
alter table:添加,刪除,修改字段;添加,刪除,修改索引,該表名,修改表屬性

mysql>alter table test add unique key(course);
mysql>alter table test change course course varchar(50) not null;

mysql>alter table test add starttime date default ‘2013-04-12’;

mysql>alter table test rename to testcourse;

mysql>rename table testcourse to test;

mysql>create table student(sid int unsigend not null auto_increment primary key,name varchar(30),cid int not null)

mysql>insert into student(name,cid) values(‘yue buqun’,2),(‘zhang wuji’,1)

mysql>select name,couse from student,courses where student.cid=courses.cid;
mysql>insert into student(name,cid) values('chen jialuo',5);

mysql>alter table student add foreing key foreign_cid(cid) references course(cid);
mysql>create table course like courses;
mysql>alter table courses engine=innodb;
mysql>show tables status;
mysql>alter table student modify cid tinyint unsigned not null;
mysql>show indexes from student;
mysql>insert into student(name,cid) values('chen jialuo',5);

刪除表:
innodb支持外鍵

create index創建索引
show indexes from tb_name 顯示指定表上的索引
create index index_name on tb_name(col,...);

col_name[(length)] [asc|desc]
name

mysql>create index name_on_student on student(name) usinag btree;

mysql>drop index name_on_student on student;

mysql>create index name_on_student on student(name(5)desc) using btree;

mysql>show indexes from student;

DDL:

DML:
select
insert into
delete
update
select select-list from tb where qualification

查詢語句類型:
簡單查詢
多表查詢
子查詢

select from tb_name;
select filed1,filed2 from tb_name;投影
select [distinct]
from tb_name where qualification;選擇

mysql>select from students;
mysql>select
from students where age>=20;
mysql>select name,age from students where age >=20;
mysql>select name,age from students where gender='M';

mysql>select gender from students;
mysql>select distinct gender from students;

from子句:要查詢的關係 表、多個表,其它select語句

where子句:布爾關係表達式,=,<,>,<=,>=
邏輯關係:and,or,not,between ... and ...
like ""
%:任意長度任意字符
_:任意單個字符
rlike "正則表達式"
in/not in
is null
is not null

mysql>select name,age from students where age+1>=20;
mysql>select name,age,gender from students where age>20 and gender='M';
mysql>select name,age,gender from students where age>20 and gender='M' or gender='M';
mysql>select name,age,gender from students where not age>20;
mysql>select name,age,gender from students where not age>20 and not gender='M';
mysql>select name,age,gender from students where not (age>20 or gender='M');
mysql>select name,age from students where age between 20 and 25;
mysql>select name from students where name like 'Y%';
mysql>select name from students where name like 'Y____';
mysql>select name from students where name like '%ing%';
mysql>select name from students where name rlike '^[MNY].*$';
mysql>select name from students where age=20 or age=18 or age=25;
mysql>select name from students where age in(18,20,25);
mysql>select name from students where CID is null;

order by filed_name {asc|desc}
mysql>select name from students where CID is not null order by name desc;

字段別名:as
mysql>select name as students_name from students;
mysql>select 2+1;
mysql>select 2+1 as sum;

limit子句:limit [offset(偏移量),count]

mysql>select name as student_name from students limit 2;
mysql>select name as student_name from students limit 2,3;

聚合:sum(),min(),max(),count()
mysql>select avg(age) from students;
mysql>select min(age) from students;
mysql>select max(age) from students;
mysql>select sum(age) from students;
mysql>select count(age) from students;

group by:分組
having qualification
mysql>select age,gender from students group by gender;
mysql>select avg(age) from students group by gender;
mysql>select count(CID1),CID1 from students group by CID1;

mysql>select count(cid1) as persons,cid from students group by cid1 having persons>=2;

多表查詢:
連接:
交叉連接:笛卡爾乘積
自然連接:
外連接:左外連接... left join ... on ...,右外連接... right join ... on ...
自連接

mysql>select from students,course;
mysql>select
from students,course where students.cid1=course.cid;
mysql>select students.name,course.cname from students,course where students,cid1=course.cid;
mysql>select s.name,c.cname from students as s,course as c where s.cid1=c.cid;
mysql>select students.name,course.cname from students left join course on students.cid1=course.cid;
mysql>select students.name,course.cname from students right join course on students.cid1=course.cid;
mysql>select c.name as stu,s.name as teacher from students as s,students as c where c.tid=s.sid;

子查詢:
where ...> (select from ...)比較操作中使用子查詢:子查詢只能返回單個值
in/not in(select
from ...):使用子查詢
mysql>select name from students where age > (select avg(age) from students);
mysql>select name from students where age in (select age from tutors);
在from中使用子查詢:
mysql>select name,age from (select name,age from students) as t where t.age >=20;

聯合查詢:
(select from ...)union(select from ...)
mysql>(select name,age from students) union (select tname,age from tutors);

1.挑選出course表中沒有被students中cid2學習的課程名稱
mysql>select cname from course where cid not in (select distinct cid2 from students where cid2 is not null);

2.挑選出沒有教授任何課程的老師,每個老師以及所教授課程的對應關係在course表中
mysql>select tname from tutors where tid not in (select distinct tid from courses)

3.找出students表中cid1有兩個或兩個以上同學學習了的同一門課程的課程名稱
mysql>select cname from course where cid in (select cid1 from students group by cid1 having count(cid1) >=2);

4.顯示每一位老師及其所教授的課程,沒有教授的課程的保持爲null
mysql>select t.tname,c.cname from tutors as t left join course as c on t.tid=c.tid;

5.顯示每位同學cid1課程的課程名及其講授了相關課程的老師的名稱
mysql>select name,cname,tname from students,course,tutors where students.cid1=course.cid and course.tid=tutors.tid;

視圖:存儲下來的select語句
基於基表的查詢結果
view
create view
物化視圖:select
mysql>create view sct as select name,cname,tname from students,course,tutors where students.cid1=course.cid and course.tid=tutors.tid;

mysql>show create view sct\G;

mysql -e 'select * from jiaowu.students'
mysql -e "insert into jiaowu.students(name,age,gender,cid1,cid2,tid,createtime) values('stu1',23,'F',4,1,6,'2013-04-26 17:56:00')"

廣義查詢:
DML:
delete
insert into
update

insert into tb_name(col1,col2,...)values(val1,val2,...)[,val1,val2,...),...]
字符型:單引號
數值型:不需要引號
日期時間型:
空值:null,‘ ’
mysql>insert into tutors set tname="tom",cender="F",age=30;
mysql>select from tutors;
mysql>select
from tutors order by tid desc limit 1;
mysql>select last_insert_id();
mysql>desc students;
mysql>desc tutors;
mysql>select name,gender,age from students where age > 20;
mysql>insert into tutors set tname='tom',gender='F',age=30;
mysql>insert into tutors (tname,gender,age) select name,gender,age from students where age > 20;

REPLACE INTO

DELETE:
delete from tb_name where condition;

truncate tb_name:清空表,並重置autoincrement數量
truncate students

UPDATE:
update tb_name set col1...,col2=... where

連接管理器:
接受請求
創建線程
認證用戶
建立安全連接
mysql>select CURRENT_TIME()

併發控制:
Mbox:MDA
c/s:100
10分鐘:
多版本併發控制:MVCC
鎖:
讀鎖:共享鎖
寫鎖:獨佔鎖
lock tables tb_name lock_type{read|write}
unlock tables

鎖粒度:從大到小,MySQL服務器僅支持表級鎖,行鎖需要由存儲引擎完成:
表鎖:
頁鎖:
行鎖:
mysql>lock tables tutors read;

事務:
RDBMS:ACID(原子性,一致性,隔離性,持久性)

myisam:
innodb:
事務日誌:
重做日誌redo log
撤消日誌undo log
日誌組

隔離性:
隔離級別:
read uncommitted:讀未提交,即不用commit就執行成功了,其他人立即可以看到改變的結果
read committed:讀提交,即只有commit之後纔算執行成功,其他人才能看到改變的結果
repatable read:可重讀,即在全部事務commit之前(即雙方的事務都要進行提交),其他人看到的結果是一樣的。
seriablizable:可串行,即對方只有commit以後,其他人才能進行操作

mysql>show global like '%iso%';

服務器變量:
全局變量:修改後不影響當前會話,只對新建的會話有效
會話變量:僅對當前會話有效,而且是立即生效

永久有效:修改配置文件

修改:set{session|global} var_name=‘’
mysql>set tx_isolation='read-uuncommitted';

多事務同時執行:彼此之間互相不影響的方式進行併發
事物之間交互:通過數據集
事務:cpu,I/O
RDBMS,
ACID:
automicity:原子性,事務所引起的數據庫操作,要麼都完成,要麼都不執行;
consistency:一致性,A(3000)--》B(2000)
isolation:隔離性,靠事務調度來實現
事務調度:事務之間影響最小
mvcc:多版本併發控制
durability:一旦事務成功完成,系統必須保證任何故障都不會引起事務表示出不一致性;
1.事務提交之前就已經寫出數據至持久存儲;
2.結合事務日誌完成;事務日誌是順序IO,數據文件是隨機IO

事務的狀態:
活動的:active
部分提交的:最後一條語句執行後
失敗的:
終止的:
提交的:

事務:併發執行
1.提高吞吐量和資源利用率
2.減少等待時間

事務調度:
可恢復調度:
無級聯調度

隔離級別:
read uncommitted(不需要提交就能生效)
read committed(必須要提交才能生效)
repeatable read
serializable

併發控制依賴的技術手段:

時間戳
多版本和快照隔離
餓死
死鎖

SQL,ODBC
start tansaction:啓動事務
commit:提交
rollback:回滾

當commit之後代表此事務已經完結,進行下一個操作仍要重新啓動事務

mysql>start transaction;
mysql>select * from tutors;
mysql>delete from tutors where tname like 'stu%';
mysql>rollback;
mysql>commit;
mysql>select @@autocommit;

如果沒有明確啓動事務:
autocommit:能實現自動提交,每一個操作都直接提交;

建議:明確使用事務,並且關閉自動提交
mysql>set autocommit=0;

保存點:savepoint
回滾至保存點:rollback to sid
mysql>savepoint ab;
mysql>rollback to ab;
mysql>select @@tx_isolation;
mysql>set tx_isolation='read-uncommitted';
mysql>start transaction;
mysql>update tutors set age=50 where tid=12;
mysql>set tx_isolation='read-committed';
mysql>commit;
mysql>start transaction
mysql>set tx_isolation='repeatable-read';
mysql>set tx_isolation='serializable';

MySQL:br/>用戶
密碼:password()
用戶名@主機
賬號:認證
權限:授權
user:用戶賬號、全局權限
db:庫級別權限
host:廢棄
tables_priv:表級別權限
columns_priv:列級別權限
procs_priv:存儲過程和存儲函數相關的權限
proxies_priv:代理用戶權限

用戶賬號:br/>用戶@主機
用戶名:16字符以內
主機:
主機名:www.magedu.com
IP:192.168.1.25
網絡地址:192.168.1.0/255.255.255.0
通配符:%,_:172.16.%.%,%.magedu.com

--skip-name-resolve

權限級別:
全局級別:super,
庫級別:
表級別:delete,alter,trigger
列級別:select,insert,update
存儲過程和存儲函數

臨時表:內存表
heap:16MB

觸發器:主動數據庫
insert,delete,update

create user username@host [identified by 'password']
mysql>create user catiuser@'%' indetified by 'cactiuser';

grant:授權

insert into mysql.user
show grant for
grant all privileges on [object_type].* to username@'%';

object_type:
table
function
procedure

grant execute on function db.abc to usrname@'%';

show grants for 'username@host';

grant option:
max_qureies_per_hour count
max_update_per_hour count
max_user_connections count

mysql>grant create on cactidb. to cactiuser@'%';
mysql>grant insert on cactidb.
to cactiuser@'%';
mysql>grant select on cactidb. to cactiuser@'%';
mysql>grant alter on cactidb.
to cactiuser@'%';
mysql>grant update(age) on cactidb.testtb to cactiuser@'%';
mysql>grant super on . to cactiuser@'%'
mysql>set global tx_isolation='read-uncommitied';

insert into mysql.user
mysql>flush privileges;

drop user username@'%'

rename user old_name to new_name

revoke:回收權限
mysql>revoke select on cactidb.* from cactiuser@'%';

啓動mysqld_safe時傳遞兩個參數:
--skip-grant-tables
--skip-networking
通過更新授權表方式直接修改其密碼,而後移除此兩個選項重啓服務器
service mysqld stop
mysqld_safe --skip-grant-tables --skip-networking &
mysql>select User,Host,Password from user;
mysql>update user set password=password('123456') where user='root';

錯誤日誌:long_error,log_warning

一般查詢日誌:general_log,general_log_file,log,log_output

慢查詢日誌:long_qurey_time,log_slow_queries={yes|no},slow_query_log,slow_query_log_file
log_output{table|file|none}
mysql>set global slow_query_log=1;

二進制日誌:任何引起或可能引起數據庫變化的操作:複製、即時點恢復,mysqlbinlog,

二進制日誌的格式:
基於語句:statement
基於行:row
混合方式:mixed
二進制日誌事件:
產生的時間
相對位置
二進制日誌文件:
索引文件
二進制日誌文件

查看當前正在使用的二進制日誌文件:
mysql>show master status;
mysql>show binary logs;
mysql>insert into tutors(tname.gender,age) values('stu100','M',30);
mysql>show binlog events in 'mysql-bin.000001' [from position];

mysqlbinlog:
--start-datetime
--stop-datetime

--start-position
--stop-position

mysqlbinlog mysql-bin.000001
mysqlbinlog --start-position=107 --stop-position=358 mysql-bin.000001
mysqlbinlog --start-datetime='2013-04-29 15:14:39' mysql-bin.000001 > /root/a.sql

mysql>flush logs;實現日誌滾動
mysql>purge binary logs to 'mysql-bin.000003';刪除指定日誌文件之前的日誌文件

中繼日誌:在從服務器上,從主服務器的二進制日誌文件中複製而來的事件,並保存爲的日誌文件

事務日誌:ACID,將隨機IO轉換爲順序IO;事務性存儲引擎用於保證原子性,一致性,隔離性和持久性
innodb_flush_log_at_trx_commit:
0:每秒鐘同步一次,告訴內核別在內存中緩存,直接同步到磁盤中去
1:每事務同步,並執行磁盤flush操作
2:每事務同步,但不執行磁盤flush操作

myisam:不支持事務,表鎖,不支持外鍵,支持B樹索引,fulltext索引,空間索引,支持表壓縮
innodb:支持事務,行級鎖,B樹索引,聚簇索引,自適應hash索引,表空間,raw磁盤設備
mrg_myisam

表類型

mysql>show global variables like ‘%log%’;
mysql>show global variables like '%long%';
mysql>set slow_query_log=on;
mysql>show engines;
IOPS:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章