什么是事務(wù)? \x0d\x0a\x0d\x0a事務(wù)是邏輯上的一組操作,組成這組操作的各個(gè)單元,要不全都成功要不全都失敗,這個(gè)特性就是事務(wù) \x0d\x0a\x0d\x0a注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲(chǔ)引擎 \x0d\x0a\x0d\x0a解決這個(gè)問(wèn)題: \x0d\x0a\x0d\x0amysql的事務(wù)解決這個(gè)問(wèn)題,因?yàn)閙ysql的事務(wù)特性,要求這組操作,要不全都成功,要不全都失敗,這樣就避免了某個(gè)操作成功某個(gè)操作失敗。利于數(shù)據(jù)的安全 \x0d\x0a\x0d\x0a如何使用: \x0d\x0a\x0d\x0a(1)在執(zhí)行sql語(yǔ)句之前,我們要開(kāi)啟事務(wù) start transaction; \x0d\x0a\x0d\x0a(2)正常執(zhí)行我們的sql語(yǔ)句 \x0d\x0a\x0d\x0a(3)當(dāng)sql語(yǔ)句執(zhí)行完畢,存在兩種情況: \x0d\x0a\x0d\x0a1,全都成功,我們要將sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)造成的影響提交到數(shù)據(jù)庫(kù)中,committ \x0d\x0a\x0d\x0a2,某些sql語(yǔ)句失敗,我們執(zhí)行rollback(回滾),將對(duì)數(shù)據(jù)庫(kù)操作趕緊撤銷(xiāo) \x0d\x0a\x0d\x0a(注意:mysql數(shù)據(jù)支持事務(wù),但是要求必須是innoDB存儲(chǔ)引擎) \x0d\x0amysql create table bank(name varchar(20),money decimal(5,1))engine=innodb defau \x0d\x0alt charset=utf8; \x0d\x0a\x0d\x0amysql inset into bank values('shaotuo',1000),('laohu',5000); \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a\x0d\x0a------沒(méi)有成功“回滾”執(zhí)行rollback \x0d\x0amysql start transaction; //開(kāi)啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set moey=money-500 where name='laohu'; \x0d\x0aERROR 1054 (42S22): Unknown column 'moey' in 'field list' \x0d\x0amysql rollback; //只要有一個(gè)不成功,執(zhí)行rollback操作 \x0d\x0aQuery OK, 0 rows affected (0.01 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1000.0 | \x0d\x0a| laohu | 5000.0 | \x0d\x0a+---------+--------+ \x0d\x0a------成功之后 進(jìn)行commit操作 \x0d\x0amysql start transaction; //開(kāi)啟事務(wù) \x0d\x0aQuery OK, 0 rows affected (0.00 sec) \x0d\x0a\x0d\x0amysql update bank set money=money+500 where name='shaotuo'; \x0d\x0aQuery OK, 1 row affected (0.01 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql update bank set money=money-500 where name='laohu'; \x0d\x0aQuery OK, 1 row affected (0.00 sec) \x0d\x0aRows matched: 1 Changed: 1 Warnings: 0 \x0d\x0a\x0d\x0amysql commit; //兩個(gè)都成功后執(zhí)行commit(只要不執(zhí)行commit,sql語(yǔ)句不會(huì)對(duì)真實(shí)的數(shù)據(jù)庫(kù)造成影響) \x0d\x0aQuery OK, 0 rows affected (0.05 sec) \x0d\x0a\x0d\x0amysql select*from bank; \x0d\x0a+---------+--------+ \x0d\x0a| name | money | \x0d\x0a+---------+--------+ \x0d\x0a| shaotuo | 1500.0 | \x0d\x0a| laohu | 4500.0 | \x0d\x0a+---------+--------+
我們提供的服務(wù)有:成都網(wǎng)站建設(shè)、成都網(wǎng)站制作、微信公眾號(hào)開(kāi)發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認(rèn)證、名山ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問(wèn)題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的名山網(wǎng)站制作公司
MySQL的事務(wù)如果不在任何修改,默認(rèn)是自動(dòng)提交的,也就是你只要執(zhí)行一個(gè)SQL,回車(chē)之后這個(gè)SQL語(yǔ)句如果沒(méi)有任何問(wèn)題,只需完成后是自動(dòng)提交的。
控制這個(gè)功能的參數(shù)是:autocommit。如果這個(gè)參數(shù)的值是on或者1,那么就是上面我說(shuō)的那種現(xiàn)象。如果是off或者0,則表示不會(huì)自動(dòng)提交事務(wù)。需要你顯示的去提交事務(wù)。否則鎖執(zhí)行的SQL不會(huì)不會(huì)永久生效,只會(huì)對(duì)你當(dāng)前命令行的session有效,退出MySQL后,執(zhí)行的SQL語(yǔ)句將會(huì)別回滾。
當(dāng)你需要兩個(gè)SQL語(yǔ)句同時(shí)成功或者同時(shí)失敗的時(shí)候,你可以手動(dòng)地開(kāi)啟一個(gè)事務(wù)。比如下面的場(chǎng)景:
你想向訂單表order_info表中插入一條新的訂單記錄,同時(shí)要想支付信息表payment_info中插入一條支付信息記錄,這個(gè)時(shí)候從業(yè)務(wù)的角度上來(lái)看,這兩個(gè)表中的插入操作,需要保持原子性(也就是事務(wù)的四大特性之一),也就是要么都插入成功,要么都插入失敗,不能存在訂單插入成功,支付插入失敗,反之也不可以。
要滿足上面的需求,你就需要手動(dòng)的去開(kāi)啟一個(gè)事務(wù),在這個(gè)事務(wù)中去插入兩個(gè)表中的數(shù)據(jù)。然后再提交這個(gè)事務(wù)。如果這兩個(gè)表的插入操作,你不手動(dòng)的開(kāi)啟事務(wù),MySQL自己會(huì)把兩個(gè)SQL語(yǔ)句分開(kāi)放在兩個(gè)單獨(dú)的事務(wù)中。執(zhí)行一個(gè)插入,就會(huì)自動(dòng)提交一個(gè)事務(wù),然后在執(zhí)行另外一個(gè)插入,再自動(dòng)提交另外一個(gè)事務(wù)。
在MySQL看來(lái),這是兩個(gè)分別向兩個(gè)表中插入的SQL語(yǔ)句而已,它不會(huì)從業(yè)務(wù)上考慮這兩個(gè)SQL實(shí)際的業(yè)務(wù)邏輯背景是什么。所以此時(shí)他會(huì)看成是兩個(gè)SQL語(yǔ)句,也就是兩個(gè)事務(wù)。
這樣的情況下就需要手動(dòng)的開(kāi)啟事務(wù)。
看你是什么事務(wù),jdbc事務(wù),還是分布式事務(wù),還是容器事務(wù)
1,編程式事務(wù)管理(jdbc的事務(wù)是綁定在connection上的)
Connection conn = null;
try
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:oracle:thin:@host:1521:SID","username","password");
conn.setAutoCommit(false); //取消自動(dòng)提交
PreparedStatement ps = conn.prepareCall("update something");
ResultSet rs = ps.executeQuery();
conn.commit(); //手動(dòng)提交
}
catch (Exception e)
{
conn.rollback();
e.printStackTrace();
}
finally
{
conn.close();
}
2,聲明式事務(wù)
先在工程的application.xml配置文件中添加如下代碼,開(kāi)啟事務(wù)
!-- 聲明式事務(wù)控制配置 --
tx:annotation-driven transaction-manager="txManager"/
bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"
property name="datasource" ref="bassDataSource"/property
/bean
然后在你需要開(kāi)啟事務(wù)的接口前面添加注解
@Transactional(rollbackFor = IOException.class)
public void add(String name) throws IOException
{
System.out.println("可以再類(lèi)里和方法里面添加事務(wù)注解0~0");
throw new IOException();
}
直接調(diào)用接口方法就好
分布式事務(wù)處理(mysql貌似在5.X之后才支持) 的話,
1.可以直接使用spring+atomikos框架進(jìn)行管理
參考:
就不貼測(cè)試代碼了,自己看著配置吧
2,使用JTA(Java Transaction API)進(jìn)行分布式事務(wù)管理(測(cè)試代碼如下)
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import javax.naming.InitialContext;
import javax.sql.DataSource;
import javax.transaction.SystemException;
import javax.transaction.UserTransaction;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
//分布式事務(wù)處理
public class transferAccount
{
@SuppressWarnings("null")
public void testTransferAccount()
{
UserTransaction userts = null;
Connection connA = null;
PreparedStatement psA = null;
InitialContext context = null;
Connection connB = null;
PreparedStatement psB = null;
try
{
//獲得事務(wù)管理對(duì)象
userts = (UserTransaction) context.lookup("java:comp/UserTransaction");
//獲取兩個(gè)數(shù)據(jù)庫(kù)
connA = getDataSourceA().getConnection();
connB = getDataSourceB().getConnection();
//開(kāi)啟事務(wù)
userts.begin();
//sql語(yǔ)句
psA = connA.prepareStatement("我加1");
psB = connB.prepareStatement("我減1");
//執(zhí)行sql
psA.executeUpdate();
psB.executeUpdate();
//事務(wù)提交
userts.commit();
} catch (Exception e)
{
try
{
userts.rollback();
} catch (IllegalStateException | SecurityException
| SystemException e1)
{
e1.printStackTrace();
}
e.printStackTrace();
}
finally
{
try
{
psA.close();
psB.close();
connA.close();
connB.close();
} catch (SQLException e)
{
e.printStackTrace();
}
}
}
public DataSource getDataSourceA()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1433);
dataSource.setUser("test");
dataSource.setPassword("test");
return dataSource;
}
public DataSource getDataSourceB()
{
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setDatabaseName("mysql");
dataSource.setServerName("server");
dataSource.setPortNumber(1435);
dataSource.setUser("test1");
dataSource.setPassword("test1");
return dataSource;
}
}
MySQL是一個(gè)關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng),由瑞典MySQL AB公司開(kāi)發(fā),屬于Oracle旗下產(chǎn)品,是最流行的關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)之一。
端口是3306。
表很多時(shí),使用linux腳本,需要根據(jù)需要修改一下:
和創(chuàng)建一樣,可以加上 if exists
可兩篇文章:
如:
用于在已有的表中添加、刪除或修改列。
添加 ADD
或
默認(rèn)是添加到最后,但可以指定位置。 FIRST :添加最前
AFTER 字段名 :添加指定字段之后
例子:
刪除 DROP
修改 MODIFY 主要修改原列的類(lèi)型或約束條件 同樣可以用 FIRST 和 AFTER 字段名 ,代表的是修改到哪里。
修改字段名 CHANGE
可以把表2的數(shù)據(jù)復(fù)制到表1中,但 不能復(fù)制約束性條件 。
單行
多行,注意 只有一個(gè)VALUES :
不寫(xiě) (行1, 行2...) 這一部分的話,默認(rèn)一一對(duì)應(yīng)
除了以上方法外,還可以用SET為每一行附上相應(yīng)的值。
假如沒(méi)有篩選的話,就給全部都修改了??梢杂? WHERE 篩選。
假如 沒(méi)有篩選的話,就給全部刪除了 。相當(dāng)于清空。
清空
先把表刪除,然后再建一個(gè)。與 DELETE FROM 相比, TRUNCATE 的效率更快,因?yàn)? DELETE FROM 是把記錄逐條刪除的。
查詢執(zhí)行的順序
FROM -- WHERE -- SELECT -- GROUP BY -- HAVING -- ORDER BY -- LIMIT
注意
當(dāng)數(shù)據(jù)很大,上百萬(wàn)的時(shí)候,使用LIMIT ... OFFSET ..的方式進(jìn)行分頁(yè)十分浪費(fèi)資源且耗時(shí)長(zhǎng)。最好是結(jié)合WHERE使用,如:
REGEXP 使用正則表達(dá)進(jìn)行匹配。 查詢時(shí),需要搭配WHERE或HAVING使用 。
兩個(gè)表之間有交集且要用到兩個(gè)表的數(shù)據(jù)時(shí),可以使用內(nèi)連接查詢。
LEFT JOIN 關(guān)鍵字從左表(table1)返回所有的行,即使右表(table2)中沒(méi)有匹配。如果右表中沒(méi)有匹配,則結(jié)果為 NULL。
用法:
RIGHT JOIN 關(guān)鍵字從右表(table2)返回所有的行,即使左表(table1)中沒(méi)有匹配。如果左表中沒(méi)有匹配,則結(jié)果為 NULL。 把LEFT JOIN的表1、表2調(diào)換順序,就是REGHT JOIN 。
FULL OUTER JOIN 關(guān)鍵字只要左表(table1)和右表(table2)其中一個(gè)表中存在匹配,則返回行. 相當(dāng)于結(jié)合了 LEFT JOIN 和 RIGHT JOIN 的結(jié)果。
但 MySQL中不支持 FULL OUTER JOIN 。
即SELECT嵌套。
IN 一個(gè)查詢結(jié)果作為另一個(gè)查詢的條件。 如:
EXISTS 用于判斷查詢子句是否有記錄,如果有一條或多條記錄存在返回 True,否則返回 False。True時(shí)執(zhí)行。 如:
索引的本質(zhì)是一種排好序的數(shù)據(jù)結(jié)構(gòu)。利用索引可以提高查詢速度。
常見(jiàn)的索引有:
MySQL通過(guò)外鍵約束來(lái)保證表與表之間的數(shù)據(jù)的完整性和準(zhǔn)確性。 外鍵的使用條件:
外鍵的好處:可以使得兩張表關(guān)聯(lián),保證數(shù)據(jù)的一致性和實(shí)現(xiàn)一些級(jí)聯(lián)操作。
對(duì)已有的兩個(gè)表增加外鍵 比如:主表為A,子表為B,外鍵為aid,外鍵約束名字為a_fk_b
為子表添加一個(gè)字段,當(dāng)做外鍵
為子表添加外鍵約束條件
假如刪除記錄報(bào)錯(cuò): [Err] 1451 -Cannot deleteorupdatea parent row: aforeignkeyconstraintfails (...)
這是因?yàn)镸ySQL中設(shè)置了foreign key關(guān)聯(lián),造成無(wú)法更新或刪除數(shù)據(jù)??梢酝ㄟ^(guò)設(shè)置 FOREIGN_KEY_CHECKS 變量來(lái)避免這種情況。 第一步:禁用外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=0; 第二步:刪除數(shù)據(jù) 第三步:?jiǎn)?dòng)外鍵約束,我們可以使用: SETFOREIGN_KEY_CHECKS=1; 查看當(dāng)前FOREIGN_KEY_CHECKS的值,可用如下命令: SELECT @@FOREIGN_KEY_CHECKS;
使用 UNION 來(lái)組合兩個(gè)查詢,如果第一個(gè)查詢返回 M 行,第二個(gè)查詢返回 N 行,那么組合查詢的結(jié)果一般為 M+N 行。
每個(gè)查詢必須包含相同的列、表達(dá)式和聚集函數(shù)。
默認(rèn)會(huì)去除相同行,如果需要 保留 相同行,使用 UNION ALL 。
只能包含一個(gè) ORDER BY 子句,并且必須位于語(yǔ)句的最后 。
內(nèi)置函數(shù)很多, 見(jiàn): MySQL 函數(shù)
我們一般使用 START TRANSACTION 或 BEGIN 開(kāi)啟事務(wù), COMMIT 提交事務(wù)中的命令, SAVEPOINT : 相當(dāng)于設(shè)置一個(gè)還原點(diǎn), ROLLBACK TO : 回滾到某個(gè)還原點(diǎn)下
一般的使用格式如下:
開(kāi)啟事務(wù)時(shí), 默認(rèn)加鎖
根據(jù)類(lèi)型可分為共享鎖(SHARED LOCK)和排他鎖(EXCLUSIVE LOCK)或者叫讀鎖(READ LOCK)和寫(xiě)鎖(WRITE LOCK)。
根據(jù)粒度劃分又分表鎖和行鎖。表鎖由數(shù)據(jù)庫(kù)服務(wù)器實(shí)現(xiàn),行鎖由存儲(chǔ)引擎實(shí)現(xiàn)。
除此之外,我們可以顯示加鎖
加鎖時(shí), 如果沒(méi)有索引,會(huì)鎖表,如果加了索引,就會(huì)鎖行
InnoDB默認(rèn)支持行鎖,獲取鎖是分步的,并不是一次性獲取所有的鎖,因此在鎖競(jìng)爭(zhēng)的時(shí)候就會(huì)出現(xiàn)死鎖的情況
解決方法:
即ACID特性:
由于并發(fā)事務(wù)會(huì)引發(fā)上面這些問(wèn)題, 我們可以設(shè)置事務(wù)的隔離級(jí)別解決上面的問(wèn)題.
MySQL的默認(rèn)隔離級(jí)別(可重復(fù)讀)
查看當(dāng)前會(huì)話隔離級(jí)別
方式1
方式2
設(shè)置隔離級(jí)別
主從集群的示意圖如下:
主要涉及三個(gè)線程: binlog 線程、 I/O 線程和 SQL 線程。
同步流程:
由于MySQL主從集群只會(huì)從主節(jié)點(diǎn)同步到從節(jié)點(diǎn), 不會(huì)反過(guò)來(lái)同步, 所以需要讀寫(xiě)分離
讀寫(xiě)分離需要在業(yè)務(wù)層面實(shí)現(xiàn) , 寫(xiě)數(shù)據(jù)只能在主節(jié)點(diǎn)上完成, 而讀數(shù)據(jù)可以在主節(jié)點(diǎn)或從節(jié)點(diǎn)上完成
索引是幫助MySQL高效獲取數(shù)據(jù)的排好序的數(shù)據(jù)結(jié)構(gòu)
MySQL的索引有
推薦兩個(gè)在線工具:
簡(jiǎn)單來(lái)說(shuō), B樹(shù)是在紅黑樹(shù)(一個(gè)平衡二叉樹(shù))的基礎(chǔ)上將一個(gè)節(jié)點(diǎn)存放多個(gè)值, 實(shí)現(xiàn)的, 降低了樹(shù)的高度, 每個(gè)節(jié)點(diǎn)都存放索引及對(duì)應(yīng)數(shù)據(jù)指針, 同一層的節(jié)點(diǎn)是遞增的
而B(niǎo)+樹(shù)在B樹(shù)的基礎(chǔ)上進(jìn)行優(yōu)化, 非葉子節(jié)點(diǎn)存放 子節(jié)點(diǎn)的開(kāi)始的索引, 葉子節(jié)點(diǎn)存放索引和數(shù)據(jù)的指針, 且葉子節(jié)點(diǎn)之間有雙向的指針
如下示意圖:
不同的引擎, 主鍵索引存放的數(shù)據(jù)也不一樣, 比如常見(jiàn)的 MyISAM 和 InnoDB
MyISAM 的B+樹(shù)葉子節(jié)點(diǎn)存放表數(shù)據(jù)的指針, InnoDB 的B+樹(shù)葉子節(jié)點(diǎn)存放處主鍵外的數(shù)據(jù)
其他的:
即多個(gè)列組成一個(gè)索引, 語(yǔ)法:
由于聯(lián)合索引的B+樹(shù)的結(jié)構(gòu), 根據(jù)列建立, 所以我們的查找條件也要根據(jù)索引列的順序( where column1=x, column2=y,columnN... ), 否則會(huì)全表掃描
如果你對(duì)列進(jìn)行了 (+,-,*,/,!) , 那么都將不會(huì)走索引。
OR 引起的索引失效
OR 導(dǎo)致索引是在特定情況下的,并不是所有的 OR 都是使索引失效,如果OR連接的是 同 一個(gè)字段,那么索引 不會(huì)失效 , 反之索引失效 。
這個(gè)我相信大家都明白,模糊搜索如果你前綴也進(jìn)行模糊搜索,那么不會(huì)走索引。
這兩種用法,也將使索引失效。另 IN 會(huì)走索引,但是當(dāng)IN的取值范圍較大時(shí)會(huì)導(dǎo)致索引失效,走全表掃描, 見(jiàn): MySQL中使用IN會(huì)不會(huì)走索引
不走索引。
走索引。
所以設(shè)計(jì)表的時(shí)候, 建議不可為空, 而是將默認(rèn)值設(shè)置為 "" ( NOT NULL DEFAULT "" )
function func($val,$id) {
$sql="update table set a=? where id=?";
$pre=$this-pdo-prepare($sql);
$this-pdo-beginTransaction();//開(kāi)啟事務(wù)
$bo=$pre-execute(array($val,$id));
if($bo){
//…執(zhí)行代碼……
$this-pdo-commit();//提交事務(wù)
return true;
}else{
//…執(zhí)行代碼……
$this-pdo-rollBack();//回滾事務(wù)
return false;
}
}
1.一條查詢語(yǔ)句如何執(zhí)行?
2.一條更新語(yǔ)句如何執(zhí)行?
3.innodb的redolog是什么?
4.什么是寫(xiě)緩沖
5.寫(xiě)緩沖一定好嗎?
6.什么情況會(huì)引發(fā)刷臟頁(yè)
關(guān)于一條mysql查詢語(yǔ)句在mysql中的執(zhí)行流程
如select name from test where id=10;
1.連接器---先與mysql服務(wù)端連接器建立連接,若查詢緩存命中則直接返回 (查詢緩存的弊端:查詢緩存的失效非常頻繁,只要有對(duì)一個(gè)表的更新,這個(gè)表上所有的查詢緩存都會(huì)被清空。)
2.分析器---詞法分析告訴服務(wù)端你要干什么(我要找 test表中id為10的名字) ( 其中sql語(yǔ)法錯(cuò)誤在這塊暴露 )
3.優(yōu)化器---服務(wù)端會(huì)思考該怎么執(zhí)行最優(yōu)(索引的選擇)
4.執(zhí)行器---檢查用戶對(duì)庫(kù)對(duì)表的權(quán)限
5.存儲(chǔ)引擎--存儲(chǔ)數(shù)據(jù),提供讀寫(xiě)接口
以u(píng)pdate a set name=1 where id=1;
主要區(qū)別在于在查詢到數(shù)據(jù)之后(select name from a where id=1),如果是innodb引擎它會(huì)進(jìn)行日志的兩階段提交:
1.開(kāi)啟事務(wù),寫(xiě)入redolog(innodb引擎特有),并更新內(nèi)存
3.寫(xiě)入binlog,提交事務(wù),commit
我們知道m(xù)ysql數(shù)據(jù)存儲(chǔ)包含內(nèi)存與磁盤(pán)兩個(gè)部分,innodb是按數(shù)據(jù)頁(yè)(通常為16k)從磁盤(pán)讀取到內(nèi)存中的(剩余操作在內(nèi)存中執(zhí)行),當(dāng)要更新數(shù)據(jù)時(shí),若目標(biāo)數(shù)據(jù)的數(shù)據(jù)頁(yè)剛好在內(nèi)存中,則直接更新。不在呢?
將這個(gè)更新操作(也可能是插入) 緩存在change buffer中 (redolog也會(huì)記錄這個(gè)change buffer操作)等到下一次查詢要用到這些數(shù)據(jù)時(shí),再執(zhí)行這些操作,改變數(shù)據(jù)(稱為合并操作記錄稱為merge)。
innodb_change_buffer_max_size
innodb_change_buffering
先介紹兩個(gè)概念
因?yàn)閞edolog是環(huán)形日志,當(dāng)redolog寫(xiě)滿時(shí),就需要“擦掉”開(kāi)頭的一部分?jǐn)?shù)據(jù)來(lái)達(dá)到循環(huán)寫(xiě),這里的擦掉指,指將redolog日志的checkpoint位置從 CP推進(jìn)到CP‘ ,同時(shí)將兩點(diǎn)之間的臟頁(yè)刷到磁盤(pán)上(flush操作),此時(shí)系統(tǒng)要停止所有的更新操作(防止更新操作丟失)
1.系統(tǒng)內(nèi)存不足。當(dāng)要讀取新的內(nèi)存頁(yè)時(shí)就要淘汰一些數(shù)據(jù)頁(yè),如果淘汰的正好是臟頁(yè),就要執(zhí)行一次flush操作
2.Mysql認(rèn)為系統(tǒng)處于“空閑狀態(tài)”
3.正常關(guān)閉Mysql
上述后兩者場(chǎng)景(系統(tǒng)空閑和正常關(guān)閉)對(duì)于性能都沒(méi)太大影響。
當(dāng)為第一種redolog寫(xiě)滿時(shí),系統(tǒng)無(wú)法執(zhí)行更新操作,所有操作都會(huì)堵塞
當(dāng)為第二種內(nèi)存不夠用時(shí),如果淘汰臟頁(yè)太多,影響mysql響應(yīng)時(shí)間
后兩者刷臟頁(yè)會(huì)影響性能,所以Mysql需要有刷臟頁(yè)控制策略,可以從以下幾個(gè)設(shè)置項(xiàng)考慮
1.設(shè)置innodb_io_capacity告訴innodb所在主機(jī)的IO能力
分享題目:mysql怎么開(kāi)啟事務(wù) mysql默認(rèn)開(kāi)啟事務(wù)嗎
鏈接地址:http://aaarwkj.com/article8/docpgop.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊(cè)、品牌網(wǎng)站制作、網(wǎng)站內(nèi)鏈、App設(shè)計(jì)、品牌網(wǎng)站設(shè)計(jì)、用戶體驗(yàn)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)