今日中國疫情最新消息數據平板電視seo優(yōu)化關鍵詞
一、為什么使用數據庫
數據儲存在哪里?
硬盤、網盤、U盤、光盤、內存(臨時存儲)
數據持久化
使用文件來進行存儲,數據庫也是一種文件,像excel ,xml 這些都可以進行數據的存儲,但大量數據操作,還是用數據庫文件效率最高
什么是數據庫
數據庫就是存儲數據的“倉庫”
數據庫的作用
1.存儲大量的數據,訪問和檢索數據(管理數據)
2.保證數據的完整性
3.安全與共享
4.數據可以進行組合,產生新的數據(數據分析)
數據庫的發(fā)展歷史
1.層次模型:單個記錄以父子關系形成的樹狀結構樹創(chuàng)建了一個層次狀結構,在其中數據被分解為邏輯的分類和子類,使用記錄代表邏輯數據單元。
2.網狀模型:網狀模型通過允許記錄有多個父子關系,來增強層次模型
3.關系模型:獨立于應用程序的。更改數據庫設計,而不會影響應用程序成為可能表的行和列這種結構,來替換父子框架。使用關系模型,我們可以克服早期模型的缺陷,在表之間定義復雜的關系。
表
表(table)是關系型數據庫的核心單元,它是數據存儲的地方
術語:
????????行: 記錄,實體
????????列:字段
關系:(表與表之間的關系)
1對1 :一對一關系是比較少見的關系類型。很多數據庫也很少包含一對一關系。
A 表中的一行最多只能匹配于 B 表中的一行,反之亦然。
人 身份證號
1 1
1 1
1 : 1
1對多: 最常用的關系類型是一對多關系,通常把一對多關系中,“多邊”的表稱為從表,把“一邊”的表稱為主表。
人 銀行卡
1 N
1 1
1 : N
多對多:
學生 老師
1 N
N 1
N : N
-
非關系模型(noSQL)
關系型數據庫
關系型數據庫有哪些?
Access ,Mysql (小型企業(yè), 免費),Sql Server(微軟 ,中企) , Oracle (大型) , DB2 , SyBase 等..
數據庫(Database)
DBMS(Database Manage System)
RDBMS( Relation Database Manage System)
?
數據庫是存儲和管理數據的倉庫,但數據庫并不能直接存儲數據,數據是存儲在表中的。
在存儲數據的過程中一定會用到數據庫服務器,所謂的數據庫服務器就是指在計算機上安裝一個數據庫管理程序。
關系與非關系數據庫的對比
關系型數據庫的優(yōu)勢:
1.復雜查詢可以用SQL語句方便的在- -個表以及多個表之間做非常復雜的數據查詢。
2.事務支持使得對于安全性能很高的數據訪問要求得以實現。對于這兩類數據庫,對方的優(yōu)勢就是自己的弱勢,反之亦然。
非關系型數據庫的優(yōu)勢:。
1.性能NOSQL是基于鍵值對的,可以想象成表中的主鍵和值的對應關系,而且不需要經過SQL層的解析,所以性能非常高。
2.可擴展性同樣也是因為基于鍵值對,數據之間沒有耦合性,所以非常容易水平擴展。
MySQL數據庫
發(fā)展史
2003年12月,MySQL 5.0版本發(fā)布
2008年1月,MySQL AB公司被Sun公司以10億美金收購
2008年11月,MySQL 5.1發(fā)布.
2009年4月,Oracle公 司以74億美元收購Sun公司
2010年12月,MySQL 5.5發(fā)布
詳細內容:
1、MySQL的歷史可以追溯到1979年,一個名為Monty Widenius的程序員在為TcX的小公司打工,并且用BASIC設計了一個報表工具,使其可以在4MHz主頻和16KB內存的計算機上運行。當時,這只是一個很底層的且僅面向報表的存儲引擎,名叫Unireg。
2、1990年,TcX公司的客戶中開始有人要求為他的API提供SQL支持。Monty直接借助于mSQL的代碼,將它集成到自己的存儲引擎中。令人失望的是,效果并不太令人滿意,決心自己重寫一個SQL支持。
3、 1996年,MySQL 1.0發(fā)布,它只面向一小撥人,相當于內部發(fā)布。到了1996年10月,MySQL 3.11.1發(fā)布(MySQL沒有2.x版本),最開始只提供Solaris下的二進制版本。一個月后,Linux版本出現了。在接下來的兩年里,MySQL被依次移植到各個平臺。
4、1999~2000年,MySQL AB公司在瑞典成立。Monty雇了幾個人與Sleepycat合作,開發(fā)出了Berkeley DB引擎, 由于BDB支持事務處理,因此MySQL從此開始支持事務處理了。
5、2000,MySQL不僅公布自己的源代碼,并采用GPL(GNU General Public License)許可協議,正式進入開源世界。同年4月,MySQL對舊的存儲引擎ISAM進行了整理,將其命名為MyISAM。
6、2001年,集成Heikki Tuuri的存儲引擎InnoDB,這個引擎不僅能持事務處理,并且支持行級鎖。后來該引擎被證明是最為成功的MySQL事務存儲引擎。MySQL與InnoDB的正式結合版本是4.0
7、2003年12月,MySQL 5.0版本發(fā)布,提供了視圖、存儲過程等功能。
8、2008年1月,MySQL AB公司被Sun公司以10億美金收購,MySQL數據庫進入Sun時代。在Sun時代,Sun公司對其進行了大量的推廣、優(yōu)化、Bug修復等工作。
9、2008年11月,MySQL 5.1發(fā)布,它提供了分區(qū)、事件管理,以及基于行的復制和基于磁盤的NDB集群系統,同時修復了大量的Bug。
10、2009年4月,Oracle公司以74億美元收購Sun公司,自此MySQL數據庫進入Oracle時代,而其第三方的存儲引擎InnoDB早在2005年就被Oracle公司收購。
11、2010年12月,MySQL 5.5發(fā)布,其主要新特性包括半同步的復制及對SIGNAL/RESIGNAL的異常處理功能的支持,最重要的是InnoDB存儲引擎終于變?yōu)楫斍癕ySQL的默認存儲引擎。MySQL 5.5不是時隔兩年后的一次簡單的版本更新,而是加強了MySQL各個方面在企業(yè)級的特性。Oracle公司同時也承諾MySQL 5.5和未來版本仍是采用GPL授權的開源產品。
....
MySql 8.0 新版本。
一般使用的都是Mysql 5.x;
MySQL特點
安裝簡單,部署迅速,
適合大批量快速部署
易于擴展,擴展性能極佳
架構靈活,可以根據業(yè)務特點配置適合自己的MySQL集群
開源,可以根據自己的業(yè)務需求進行二次開發(fā),
使用廣泛,幾乎所有的互聯網公司都在使用MySQL數據庫
對于OLTP業(yè)務,可以進行良好的支撐
SQL:
SQL(Structured Query Language)語言是1974年由Boyce和Chamberlin提出的一種介于關系代數與關系演算之間的結構化查詢語言,是一個通用的、功能極強的關系型數據庫語言。
SQL語句
–數據定義語言(DDL):data definition language (定義數據庫,定義表)
–數據查詢語言(DQL): data query language (查詢 數據)
–數據操作語言(DML): data manipulation language (操作數據)
–數據控制語言(DCL): data control language (用戶控制 ,權限控制 )
DDL 定義數據庫及表
1. 創(chuàng)建數據庫
? ?create database 數據庫名;
? ?
2. 使用數據庫
? ?use database 數據庫名;
? ?
3. 刪除數據庫?
? ?drop database 數據庫名;
? ?
? ?
?數據庫命名規(guī)范:
?1. 標識符不能是所用RDBMS的保留字
?2. 不允許嵌入空格或其它特殊字符
?3. 第一個字符必須是下列字符之一:a-z 和 A-Z,下劃線 (_)、at 符號 (@) 或者數字符號 (#)
?4. 后續(xù)字符可以是at符號(@)、美元符號 ($)、數字符號或下劃線,字母。
?
?
?4. 創(chuàng)建表 (數據是放在表中)
? ?語法:
? ? ? ?create table 表名 (列名 列的數據類型 ?[列的約束] , ?...)
? ? ? ?
? ? ? ?注: char , varchar 兩個類型,需要設置長度,其它的類型都不需要設置
? ? ? ?
? ? ? ?
? ?方法2:復制表(只能復制表的數據與表字段,注:表的約束不能復制)
? ? ? CREATE TABLE student2 SELECT * FROM student
? ? ? ?
5. 刪除表
? ? ?drop table 表名;
? ? ?
6. 修改表?? ?增加列
?? ??? ?alter table 表名 add 列名 數據類型
?? ??? ?
?? ??? ?ALTER TABLE student ADD address VARCHAR(100)
?? ??? ?
?? ?刪除列
?? ??? ?alter table 表名 drop 列名
?? ??? ?
?? ?更改列
?? ??? ?alter table 表名 modify 列名 類型 ? -- ?只改列的類型?
?? ??? ?alter table 表名 change 舊列名 新列名 類型
?? ??? ?
?? ?重命名表
?? ??? ?alter table 舊表名 rename 新表名
mysql中的數據類型
-
數字
A- 整型 int 4字節(jié)
B- 浮點 float 4字節(jié) 7位
double 8 字節(jié) 15位
decimal(總位數,小數點后的位數) decimal(M,D) 17字節(jié), 30位小數
注意:
M為總位數,D為小數位,M必須大于D
-
字符串
A- 固定長度字符串 char(長度)
B- 可變長度字符串 varchar(最大的長度)
C- 超長字符串 text
nchar , nvarchar , ntext 前面加n, 說明支持unicode編碼,即可以顯示中文
一般不會去使用n開頭的類型,為什么呢? 因為在創(chuàng)建數據庫時,就已經指定了編碼,支持中文顯示
3. 日期:
A: date 年月日 yyyy - MM - dd
B: datetime 年月日 時分秒 yyyy-MM-dd HH:mm:ss
擴展數據類型:
text : 存放超長文本
blob: 二進制
enum: 枚舉
數據完整性分類
什么是數據的完整性?
????????完整性 = 準確性 + 可靠性
Q: 如何保證數據的完整性?
數據完整性(約束)的分類
–1.實體完整性 主鍵約束 、 唯一約束、 標識列
? 保證 一 行數據是有效的
主鍵約束 : primary key
唯一約束 : unique
標識列 : 系統給一個自增長的值,這個值不會重復,一般默認從1開始,每次加1(步長) auto_increment
–2. 域完整性 非空約束:Not Null 默認約束:Default(定義與實體時都用default)
? 保證 一 列數據是有效的
–3. 引用完整性 外鍵約束
? 保證引用的編號是有效的
–4.用戶自定義完整性
? 保證自定義規(guī)則
DML數據操作語言
表的curd:
CURD 操作,即指對數據庫中實體對象的增Create、改Update、查Read、刪Delete操作。
增加數據 :
INSERT [INTO] 表名[(列名,...)] VALUES (值表達式,...)
-- 注: 如果所有的列都要插入數據, 表名后面的列名可以省略
INSERT [INTO] 表名SET 列名=值表達式, ...
INSERT [INTO] 表名1[(列名,...)] SELECT {*|列名,...} FROM表名2
-- 上面這種方式添加數據,要求查詢的列與插入的列,數量與數據類型要一致
注意:
在MySQL3.0.2 之后 into關鍵字在INSERT中是可以省略的,但是基于標準考慮建議大家在書寫時保留該關鍵字
修改數據:
UPDATE 表名 SET 列名 = 更新后的值, [WHERE 條件子句]
刪除數據:
方法1 :
DELETE FROM 表名 [WHERE 子句]
方法2:
TRUNCATE TABLE 表名
DELETE會記錄日志,意味著刪除后的數據還可以恢復,但是效率低。
TRUNCATE不會記錄日志,刪除后的數據不能恢復,但是效率高。TRUNCATE不能用于有外鍵約束引用的表 。
TRUNCATE 可以重置自增列, delete 不能重置自增列
TRUNCATE 只能刪除整表,不能刪除部分
DQL:
查詢數據:
select * from 表名 -- 所有列
select 列名, 列名2 ... from 表名 -- 所有列
數據完整性分類
–1.實體完整性 主鍵約束 、 唯一約束、 標識列
?保證一行數據是有效的
–2.域完整性 非空約束:Not Null 默認約束:Default(定義與實體時都用default), check約束
?保證一列數據是有效的
–3.引用完整性 外鍵約束
-4. 自定義完整性
引用完整性( 外鍵約束 )
外鍵: 一個表某列與另一個表的某列存在著依附關系(這關系是在設計這兩個表時根據業(yè)務去創(chuàng)建, 但是并沒有強制依賴)
外鍵約束: 給外鍵加上一個強制的約束,如果違反這個約束,就報錯,不允許去修改數據
(沒有建立外鍵約束,不等于沒有外鍵)
如何添加外鍵約束呢?
-
了解兩個概念, 主表,從表
創(chuàng)建外鍵約束時,必須先創(chuàng)建主表,再創(chuàng)建從表
-
創(chuàng)建約束
CONSTRAINT FOREIGN KEY(s_c_id) REFERENCES t_class(c_id)
-- 添加從表數據,依賴的主表數據一定是存在 -- 刪除主表數據,必須保證從表沒有對它的引用
問題? 項目中要不要加外鍵約束
不要,用代碼去保證數據的完整性; 為什么不加,讓數據操作更方便
DQL 數據查詢語言
查詢的機制
從表的第一開始,把整個數據都進行查詢 ,返回符合條件的數據; 返回的數據也表格形式,但是臨時的,不會進行保存
簡單查詢
投影操作
select * from 表名 -- 全部列
select 列名1, 列名2 from 表名 -- 部分列
select 列名1 as 別名 from 表名 -- 部分列且改變列名
select 列名1+5 from 表名 ;-- 計算列
select distinct 列名1 from 表名 -- 去重復
select 列名 from 表名 limit 開始行數 ,返回的行數 -- 序號從0開始
選擇操作
單條件:
select * from 表名 where 列名 = 值; -- 還有 >= , <= ,!=
多條件:
and , or 進行條件 的連接
select * from 表名 where 條件1 (and 或 or ) 條件2
條件范圍:
between... and ...
select * from 表名 where 列名 between 下限 and 上限
in, not in
select 列集合 from 表名 where in / not in (值列表)
like 模糊查詢
select 列集合 from 表名 where 列名 like 模式
通配符:
—: 任何單個字符
%:0個或多個任意字符
處理空值:
select 列集合 from 表名 where 列名 is null / is not null
排序操作
單列排序:
select 列名 from 表名 order by 列名
多列排序:
select 列名 from 表名 order by 列名1, 列名2
SQL的執(zhí)行順序
from - where - select - order by - limit
聚合函數
count
avg
max
min
sum
注:只返回單個值,只對不為null的數據進行統計
分組函數
select
from
where
group by
having
order by
SQL執(zhí)行順序:
from -> where -> select -> group by -> having -> order by -> limit
分組統一
group by 列名 -- 根據指定的列名分組
having 分組后進行條件篩選
需求:學生的平均成績
每個組的平均成績(group by 組名, 性別)
分組函數
select
from
where
group by
having
order by
limit
SQL執(zhí)行順序:
from -> where -> select -> group by -> having -> order by -> limit
子查詢
一個查詢語句,在嵌套一個查詢語句,這就嵌套查詢 語句就叫,子查詢 .
如下:關鍵字后面,都可以嵌套一個子查詢
select
from
where
group by
having
order by
limit
select 子查詢 (單行單列) - 效率極低,一般不用
SELECT *,(SELECT className FROM clazz WHERE id=student2.classId) AS className FROM student2
from 子查詢 (多行多列)
?SELECT *
? FROM ( SELECT * FROM student2 WHERE classId = 3) AS a WHERE StudentName LIKE '張%'
where 子查詢
關系表達式后( = ,> ,<, !=),返回的是單行單列
?SELECT * FROM student2 WHERE classId = ( SELECT id FROM clazz WHERE className='352')
?in/not in , 返回的多行,單列
表聯接
笛卡爾乘積
SELECT * FROM student2,clazz WHERE student2.classId = clazz.Id ?-- 默認顯示笛卡爾乘積
?-- 寫法, 表聯接?
?
?SELECT * FROM student2 JOIN clazz ON student2.classId = clazz.Id
多表連接
SELECT * FROM student3 stu JOIN score s ON stu.id = s.studentId
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?JOIN course c ON s.courceId = c.id
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?JOIN teacher t ON c.teacherId = t.id
表聯接分類:
內聯接:
inner join -> join
外聯接:
左外聯接 outer left join -> left join
右外聯接: outer right join -> right join
存儲引擎
MySQL數據庫及其分支版本主要的存儲引擎有InnoDB、MyISAM、 Memory等。
簡單地理解,存儲引擎就是指表的類型以及表在計算機上的存儲方式。
存儲引擎的概念是MySQL的特色,使用的是一個可插拔存儲引擎架構,能夠在運行的時候動態(tài)加載或者卸載這些存儲引擎。
不同的存儲引擎決定了MySQL數據庫中的表可以用不同的方式來存儲。我們可以根據數據的特點來選擇不同的存儲引擎。
MySQL支持哪些存儲引擎?
MySQL支持多種存儲引擎,比如InnoDB,MyISAM,Memory,Archive等等.在大多數的情況下,直接選擇使用InnoDB引擎都是最合適的,InnoDB也是MySQL的默認存儲引擎.
-
InnoDB和MyISAM有什么區(qū)別?
-
InnoDB支持事物,而MyISAM不支持事物
-
InnoDB支持行級鎖,而MyISAM支持表級鎖
-
InnoDB支持MVCC, 而MyISAM不支持
-
InnoDB支持外鍵,而MyISAM不支持
-
InnoDB不支持全文索引,而MyISAM支持。
事務
事務:就是把多個數據庫操作打包成一個“不可分割”的整體來進行執(zhí)行,同時在這些操作執(zhí)行后,需要保證數據可靠且一致
創(chuàng)建事務:
start transcation ; -- 開啟事務 // begin
commit ; -- 提交
callback -- 回滾
ACID模型
ACID模型,就是我們常說的數據庫事務四大特性:原子性,一致性,隔離性,持久性;由這四種特性保證了事務的可靠和一致
一致性是由原子性,隔離性,持久性共同保證的
原子性: 需要向原子一樣不可分割,操作要么全部成功,要么全部失敗;
如何實現: Innodb 提供了 undo log 機制
隔離性:
事務的隔離性是指一個事務的執(zhí)行不能被其他事務干擾,即一個事務內部的操作及使用的數據對并發(fā)的其他事務是隔離的,
并發(fā)執(zhí)行的各個事務之間不能互相干擾。
分為:寫與寫隔離,寫和讀隔離
面試題
第一題:一張自增表里面總共有7 條數據,刪除了最后 2 條數據,重啟 mysql 數據庫,又插入了一條數據,此時 id 是幾?
8
第二題:如何獲取當前數據庫版本?
MySQL的兩種方式:
在cmd中輸入mysql -V查看;注意:需要在對應的目錄下執(zhí)行;
在MySQL的命令窗口[Command Line Client]中輸入:select version(); [函數];或者在Navicat或其他的工具中創(chuàng)建查詢輸入select version();
Oracle:
select * from v$version;
select * from product_component_version;
第三題:說一下ACID是什么?
① 原子性(Atomicity,或稱不可分割性)、
一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環(huán)節(jié)。事務在執(zhí)行過程中發(fā)生錯誤,會被回滾(Rollback)到事務開始前的狀態(tài),就像這個事務從來沒有執(zhí)行過一樣。
② 一致性(Consistency)、
在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規(guī)則,這包含資料的精確度、串聯性以及后續(xù)數據庫可以自發(fā)性地完成預定的工作。
③ 隔離性(Isolation,又稱獨立性)、
數據庫允許多個并發(fā)事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務并發(fā)執(zhí)行時由于交叉執(zhí)行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。
④ 持久性(Durability)。
事務處理結束后,對數據的修改就是永久的,即便系統故障也不會丟失。
第四題:mysql 的內連接、左連接、右連接有什么區(qū)別?
內連接:只顯示所有有關聯的數據,左表或右表沒有的則不顯示;
左連接:顯示左表的所有數據,右表沒有的用null補全;
右連接:顯示右表的所有數據,左表沒有的用null補全;
第五題:mysql 索引是怎么實現的?
MySQL采用B+ Tree實現索引;
B+ Tree的特點:
單節(jié)點能存儲更多的數據,減少磁盤IO次數;
葉子節(jié)點形成有序鏈表,便于執(zhí)行范圍操作(如:where id < 10);
聚集索引,葉子節(jié)點存儲數據,而非聚集索引,葉子節(jié)點存儲數據的地址;
說一下數據庫的事務隔離?
第六題:事務的隔離級別?
第一類丟失更新:
第二類丟失更新:當兩個或多個事務更新同一行時,都是基于最初選定的值更新,由于事務是相互隔離的,所以最后一個事物的更新覆蓋其他事務的更新;
臟讀:事務A讀取了事務B還沒有提交的數據(讀未提交);
不可重復讀:在一個事務內多次讀取了某個數據,而讀取出來的數據不一致(數據發(fā)生改變或被刪除);
幻讀:在一個事務內的操作中發(fā)現了未被操作的數據;幻讀出現的前提是并發(fā)的事務中有事務發(fā)生了插入、刪除操作;
事務的隔離級別越高,在并發(fā)下出現的上述五種問題越少,但同時付出的性能開銷也越大(并發(fā)和性能之間的權衡);
DEFAULT默認隔離級別:
每種數據庫支持的數據隔離級別不一樣;
MySql可以使用select @@(global.(系統級別)|session級別)tx_isolation查看默認的事務隔離級別(REPEATABLE-READ);
Spring將事務隔離級別設置為DEFAULT表示使用底層數據庫的默認事務隔離級別;
READ-UNCOMMITTED讀未提交:
能讀取到未被提交的數據,無法解決臟讀、不可重復讀及幻讀;
READ-COMMITTED讀已提交:
能讀取到已經提交的數據,能防止臟讀,但是不能防止不可重復讀和幻讀;
REPEATABLE-READ重復讀取:
在讀取完數據之后加鎖,類似于”select * from XXX for update”,明確表示讀取數據為了更新;REPEATABLE-READ讀取一條數據,事務不結束,別的事務就不可以修改這條數據,解決了臟讀、不可重復讀,但是不能解決幻讀;
SERLALIZABLE串行讀:
最高事務隔離級別,一個事務(包括子事務)接一個事務的執(zhí)行,解決了幻讀問題;
注意:Oracle只支持Read Committed和Serializable和自定義的Read Only隔離級別;
常用命令:
修改隔離級別:set tx_isolation = “四種事務隔離級別”;
事務傳播特性(面試) 7種傳播特性
概念:當事務方法被另外一個事務方法調用時,指定事務應該如何傳播;
傳播屬性(默認REQUIRED):
REQUIRED:事務內所有的子事務都成功執(zhí)行結束后(都不拋出異常)才提交數據;
REQUIRED_NEW:事務內所有的子事務都是獨立事務,執(zhí)行一個掛起一個(事務完成一個提交一個,拋出異常的不提交并結束整個事務);不管是否存在事務,都new一個新的事務,將原來的事務掛起,新的事務執(zhí)行完畢后再執(zhí)行老的事務;
SUPPORTS:如果有正在運行的事務,則在該事務內運行,否則可不運行在事務中;
NOT_SUPPORTS:當前方法不運行在事務中,如果有正在運行的事務,則將該事務掛起(不開啟事務);
MANDATORY(強制):當前方法必須運行在事務中,如果沒有正在運行的事務,則拋出異常;
NERVER:當前方法不運行在事務中,如果有運行的事務,則拋出異常;
NESTED(嵌套):如果有事務在運行,當前事務方法嵌套到運行事務中運行,否則開啟一個新事務運行;
注:MySql中索引是INNODB,才支持事務;MYISAM不支持事務;
第七題:說一下mysql 的行鎖和表鎖?
表鎖:
特點:加鎖快,開銷小;不會出現死鎖(一次性獲取全部鎖);發(fā)生鎖沖突的概率高,并發(fā)低;
使用表鎖的場景:
場景一:事務需要更新大部分或全部表數據;
場景二:事務需要使用多張表,可能會引起死鎖,造成大量事務回滾;
行鎖:
共享鎖:允許一個事務去讀一行,阻止其他事務獲得相同數據集的排他鎖;
排他鎖:允許獲取排他鎖的更新數據,阻止其他事務獲取相同數據集的共享讀鎖和排他寫鎖;
特點:開銷大,加鎖慢;可能出現死鎖;發(fā)生鎖沖突的概率低,并發(fā)最高;
注:InnoDB行鎖是通過索引上的索引項實現的,而Oracle則是給數據行加鎖;InnoDB只有通過索引條件檢索數據,才會使用行鎖,否則使用表鎖;
注:表鎖適用于并發(fā)度不高,以查詢?yōu)橹鞯男⌒蛍eb應用;而行鎖適用于高并發(fā),對事務完整性要求較高的系統;
第八題:如何做mysql的性能優(yōu)化?(重要)
①用PreparedStatement一般來說比Statement性能高;
②有外鍵約束會影響插入和刪除性能,如果程序能夠保證數據的完整性,在設計數據庫時就去掉外鍵;
看mysql幫助文檔子查詢章節(jié)的最后部分,下面的子查詢語句要比第二條關聯查詢效率高:
select e.name,e.salary where e.managerid=(select id from employee where name='zxx');
select e.name,e.salary,m.name,m.salary from employees e,employees m where
e.managerid = m.id and m.name='zxx';
③表中允許適當冗余;
④sql語句全部大寫,特別是列名和表名都大寫。
⑤開啟緩存查詢(使用變量代替函數);根據緩存的特點,不要拼湊條件,而是用?和PreparedStatment;
⑥對頻繁查詢的字段建立索引;查詢時盡量使用主鍵作為條件;
⑦對于明確知道查詢結果只有一條數據的使用limit 1;
⑧不要使用select *,需要什么字段就查詢什么字段;
⑨表設計時盡量用固定長度的類型如char;
⑩垂直分割:將表中的常用列和非常用列垂直拆分成多張表存儲;如:將姓名和密碼單獨從用戶表中獨立出來。
使用expain關鍵字可以查看性能;
批量插入(batch insert,group commit)