指令+數據,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
動態調整參數的生效方式:
全局:對當前會話無效,只對新建會話有效
會話:及時生效,但只對當前會話生效
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';
--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: