真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

怎么優(yōu)化mysql數(shù)據(jù)庫(kù),Mysql數(shù)據(jù)庫(kù)優(yōu)化

優(yōu)化MYSQL數(shù)據(jù)庫(kù)的方法

在開(kāi)始演示之前,我們先介紹下兩個(gè)概念。

成都創(chuàng)新互聯(lián)成都網(wǎng)站建設(shè)按需制作網(wǎng)站,是成都網(wǎng)站制作公司,為宴會(huì)酒店設(shè)計(jì)提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開(kāi)發(fā)等。成都網(wǎng)站營(yíng)銷(xiāo)推廣熱線:18982081108

概念一,數(shù)據(jù)的可選擇性基數(shù),也就是常說(shuō)的cardinality值。

查詢(xún)優(yōu)化器在生成各種執(zhí)行計(jì)劃之前,得先從統(tǒng)計(jì)信息中取得相關(guān)數(shù)據(jù),這樣才能估算每步操作所涉及到的記錄數(shù),而這個(gè)相關(guān)數(shù)據(jù)就是cardinality。簡(jiǎn)單來(lái)說(shuō),就是每個(gè)值在每個(gè)字段中的唯一值分布狀態(tài)。

比如表t1有100行記錄,其中一列為f1。f1中唯一值的個(gè)數(shù)可以是100個(gè),也可以是1個(gè),當(dāng)然也可以是1到100之間的任何一個(gè)數(shù)字。這里唯一值越的多少,就是這個(gè)列的可選擇基數(shù)。

那看到這里我們就明白了,為什么要在基數(shù)高的字段上建立索引,而基數(shù)低的的字段建立索引反而沒(méi)有全表掃描來(lái)的快。當(dāng)然這個(gè)只是一方面,至于更深入的探討就不在我這篇探討的范圍了。

概念二,關(guān)于HINT的使用。

這里我來(lái)說(shuō)下HINT是什么,在什么時(shí)候用。

HINT簡(jiǎn)單來(lái)說(shuō)就是在某些特定的場(chǎng)景下人工協(xié)助MySQL優(yōu)化器的工作,使她生成最優(yōu)的執(zhí)行計(jì)劃。一般來(lái)說(shuō),優(yōu)化器的執(zhí)行計(jì)劃都是最優(yōu)化的,不過(guò)在某些特定場(chǎng)景下,執(zhí)行計(jì)劃可能不是最優(yōu)化。

比如:表t1經(jīng)過(guò)大量的頻繁更新操作,(UPDATE,DELETE,INSERT),cardinality已經(jīng)很不準(zhǔn)確了,這時(shí)候剛好執(zhí)行了一條SQL,那么有可能這條SQL的執(zhí)行計(jì)劃就不是最優(yōu)的。為什么說(shuō)有可能呢?

來(lái)看下具體演示

譬如,以下兩條SQL,

A:

select * from t1 where f1 = 20;

B:

select * from t1 where f1 = 30;

如果f1的值剛好頻繁更新的值為30,并且沒(méi)有達(dá)到MySQL自動(dòng)更新cardinality值的臨界值或者說(shuō)用戶(hù)設(shè)置了手動(dòng)更新又或者用戶(hù)減少了sample page等等,那么對(duì)這兩條語(yǔ)句來(lái)說(shuō),可能不準(zhǔn)確的就是B了。

這里順帶說(shuō)下,MySQL提供了自動(dòng)更新和手動(dòng)更新表cardinality值的方法,因篇幅有限,需要的可以查閱手冊(cè)。

那回到正題上,MySQL 8.0 帶來(lái)了幾個(gè)HINT,我今天就舉個(gè)index_merge的例子。

示例表結(jié)構(gòu):

mysql desc t1;+------------+--------------+------+-----+---------+----------------+| Field ? ? ?| Type ? ? ? ? | Null | Key | Default | Extra ? ? ? ? ?|+------------+--------------+------+-----+---------+----------------+| id ? ? ? ? | int(11) ? ? ?| NO ? | PRI | NULL ? ?| auto_increment || rank1 ? ? ?| int(11) ? ? ?| YES ?| MUL | NULL ? ?| ? ? ? ? ? ? ? ?|| rank2 ? ? ?| int(11) ? ? ?| YES ?| MUL | NULL ? ?| ? ? ? ? ? ? ? ?|| log_time ? | datetime ? ? | YES ?| MUL | NULL ? ?| ? ? ? ? ? ? ? ?|| prefix_uid | varchar(100) | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|| desc1 ? ? ?| text ? ? ? ? | YES ?| ? ? | NULL ? ?| ? ? ? ? ? ? ? ?|| rank3 ? ? ?| int(11) ? ? ?| YES ?| MUL | NULL ? ?| ? ? ? ? ? ? ? ?|+------------+--------------+------+-----+---------+----------------+7 rows in set (0.00 sec)

表記錄數(shù):

mysql select count(*) from t1;+----------+| count(*) |+----------+| ? ?32768 |+----------+1 row in set (0.01 sec)

這里我們兩條經(jīng)典的SQL:

SQL C:

select * from t1 where rank1 = 1 or rank2 = 2 or rank3 = 2;

SQL D:

select * from t1 where rank1 =100 ?and rank2 =100 ?and rank3 =100;

表t1實(shí)際上在rank1,rank2,rank3三列上分別有一個(gè)二級(jí)索引。

那我們來(lái)看SQL C的查詢(xún)計(jì)劃。

顯然,沒(méi)有用到任何索引,掃描的行數(shù)為32034,cost為3243.65。

mysql explain ?format=json select * from t1 ?where rank1 =1 or rank2 = 2 or rank3 = 2\G*************************** 1. row ***************************EXPLAIN: { ?"query_block": { ? ?"select_id": 1, ? ?"cost_info": { ? ? ?"query_cost": "3243.65" ? ?}, ? ?"table": { ? ? ?"table_name": "t1", ? ? ?"access_type": "ALL", ? ? ?"possible_keys": [ ? ? ? ?"idx_rank1", ? ? ? ?"idx_rank2", ? ? ? ?"idx_rank3" ? ? ?], ? ? ?"rows_examined_per_scan": 32034, ? ? ?"rows_produced_per_join": 115, ? ? ?"filtered": "0.36", ? ? ?"cost_info": { ? ? ? ?"read_cost": "3232.07", ? ? ? ?"eval_cost": "11.58", ? ? ? ?"prefix_cost": "3243.65", ? ? ? ?"data_read_per_join": "49K" ? ? ?}, ? ? ?"used_columns": [ ? ? ? ?"id", ? ? ? ?"rank1", ? ? ? ?"rank2", ? ? ? ?"log_time", ? ? ? ?"prefix_uid", ? ? ? ?"desc1", ? ? ? ?"rank3" ? ? ?], ? ? ?"attached_condition": "((`ytt`.`t1`.`rank1` = 1) or (`ytt`.`t1`.`rank2` = 2) or (`ytt`.`t1`.`rank3` = 2))" ? ?} ?}}1 row in set, 1 warning (0.00 sec)

我們加上hint給相同的查詢(xún),再次看看查詢(xún)計(jì)劃。

這個(gè)時(shí)候用到了index_merge,union了三個(gè)列。掃描的行數(shù)為1103,cost為441.09,明顯比之前的快了好幾倍。

mysql explain ?format=json select /*+ index_merge(t1) */ * from t1 ?where rank1 =1 or rank2 = 2 or rank3 = 2\G*************************** 1. row ***************************EXPLAIN: { ?"query_block": { ? ?"select_id": 1, ? ?"cost_info": { ? ? ?"query_cost": "441.09" ? ?}, ? ?"table": { ? ? ?"table_name": "t1", ? ? ?"access_type": "index_merge", ? ? ?"possible_keys": [ ? ? ? ?"idx_rank1", ? ? ? ?"idx_rank2", ? ? ? ?"idx_rank3" ? ? ?], ? ? ?"key": "union(idx_rank1,idx_rank2,idx_rank3)", ? ? ?"key_length": "5,5,5", ? ? ?"rows_examined_per_scan": 1103, ? ? ?"rows_produced_per_join": 1103, ? ? ?"filtered": "100.00", ? ? ?"cost_info": { ? ? ? ?"read_cost": "330.79", ? ? ? ?"eval_cost": "110.30", ? ? ? ?"prefix_cost": "441.09", ? ? ? ?"data_read_per_join": "473K" ? ? ?}, ? ? ?"used_columns": [ ? ? ? ?"id", ? ? ? ?"rank1", ? ? ? ?"rank2", ? ? ? ?"log_time", ? ? ? ?"prefix_uid", ? ? ? ?"desc1", ? ? ? ?"rank3" ? ? ?], ? ? ?"attached_condition": "((`ytt`.`t1`.`rank1` = 1) or (`ytt`.`t1`.`rank2` = 2) or (`ytt`.`t1`.`rank3` = 2))" ? ?} ?}}1 row in set, 1 warning (0.00 sec)

我們?cè)倏聪耂QL D的計(jì)劃:

不加HINT,

mysql explain format=json select * from t1 where rank1 =100 and rank2 =100 and rank3 =100\G*************************** 1. row ***************************EXPLAIN: { ?"query_block": { ? ?"select_id": 1, ? ?"cost_info": { ? ? ?"query_cost": "534.34" ? ?}, ? ?"table": { ? ? ?"table_name": "t1", ? ? ?"access_type": "ref", ? ? ?"possible_keys": [ ? ? ? ?"idx_rank1", ? ? ? ?"idx_rank2", ? ? ? ?"idx_rank3" ? ? ?], ? ? ?"key": "idx_rank1", ? ? ?"used_key_parts": [ ? ? ? ?"rank1" ? ? ?], ? ? ?"key_length": "5", ? ? ?"ref": [ ? ? ? ?"const" ? ? ?], ? ? ?"rows_examined_per_scan": 555, ? ? ?"rows_produced_per_join": 0, ? ? ?"filtered": "0.07", ? ? ?"cost_info": { ? ? ? ?"read_cost": "478.84", ? ? ? ?"eval_cost": "0.04", ? ? ? ?"prefix_cost": "534.34", ? ? ? ?"data_read_per_join": "176" ? ? ?}, ? ? ?"used_columns": [ ? ? ? ?"id", ? ? ? ?"rank1", ? ? ? ?"rank2", ? ? ? ?"log_time", ? ? ? ?"prefix_uid", ? ? ? ?"desc1", ? ? ? ?"rank3" ? ? ?], ? ? ?"attached_condition": "((`ytt`.`t1`.`rank3` = 100) and (`ytt`.`t1`.`rank2` = 100))" ? ?} ?}}1 row in set, 1 warning (0.00 sec)

加了HINT,

mysql explain format=json select /*+ index_merge(t1)*/ * from t1 where rank1 =100 and rank2 =100 and rank3 =100\G*************************** 1. row ***************************EXPLAIN: { ?"query_block": { ? ?"select_id": 1, ? ?"cost_info": { ? ? ?"query_cost": "5.23" ? ?}, ? ?"table": { ? ? ?"table_name": "t1", ? ? ?"access_type": "index_merge", ? ? ?"possible_keys": [ ? ? ? ?"idx_rank1", ? ? ? ?"idx_rank2", ? ? ? ?"idx_rank3" ? ? ?], ? ? ?"key": "intersect(idx_rank1,idx_rank2,idx_rank3)", ? ? ?"key_length": "5,5,5", ? ? ?"rows_examined_per_scan": 1, ? ? ?"rows_produced_per_join": 1, ? ? ?"filtered": "100.00", ? ? ?"cost_info": { ? ? ? ?"read_cost": "5.13", ? ? ? ?"eval_cost": "0.10", ? ? ? ?"prefix_cost": "5.23", ? ? ? ?"data_read_per_join": "440" ? ? ?}, ? ? ?"used_columns": [ ? ? ? ?"id", ? ? ? ?"rank1", ? ? ? ?"rank2", ? ? ? ?"log_time", ? ? ? ?"prefix_uid", ? ? ? ?"desc1", ? ? ? ?"rank3" ? ? ?], ? ? ?"attached_condition": "((`ytt`.`t1`.`rank3` = 100) and (`ytt`.`t1`.`rank2` = 100) and (`ytt`.`t1`.`rank1` = 100))" ? ?} ?}}1 row in set, 1 warning (0.00 sec)

對(duì)比下以上兩個(gè),加了HINT的比不加HINT的cost小了100倍。

總結(jié)下,就是說(shuō)表的cardinality值影響這張的查詢(xún)計(jì)劃,如果這個(gè)值沒(méi)有正常更新的話(huà),就需要手工加HINT了。相信MySQL未來(lái)的版本會(huì)帶來(lái)更多的HINT。

北大青鳥(niǎo)java培訓(xùn):Mysql數(shù)據(jù)庫(kù)的設(shè)計(jì)和優(yōu)化?

在JAVA開(kāi)發(fā)中數(shù)據(jù)庫(kù)的學(xué)習(xí)也是我們需要了解的,截下來(lái)幾篇文章都是關(guān)于數(shù)據(jù)庫(kù)的設(shè)計(jì)和應(yīng)用,那么java課程培訓(xùn)機(jī)構(gòu)廢話(huà)不多說(shuō)開(kāi)始學(xué)習(xí)吧!??數(shù)據(jù)庫(kù)的設(shè)計(jì)??數(shù)據(jù)庫(kù)設(shè)計(jì)是基礎(chǔ),數(shù)據(jù)庫(kù)優(yōu)化是建立在設(shè)計(jì)基礎(chǔ)之上的。

好的數(shù)據(jù)庫(kù)一定擁有好的設(shè)計(jì)。

數(shù)據(jù)庫(kù)設(shè)計(jì)的目標(biāo)是為用戶(hù)和各種應(yīng)用系統(tǒng)提供一個(gè)信息基礎(chǔ)設(shè)施和高效的運(yùn)行環(huán)境。

數(shù)據(jù)庫(kù)的三大范式??第一范式1NF:所有的域都應(yīng)該是原子性的,即數(shù)據(jù)庫(kù)表的每一列都是不可分割的原子數(shù)據(jù)項(xiàng),而不能是集合,數(shù)組,記錄等非原子數(shù)據(jù)項(xiàng)。

第二范式2Nf:第二范式在第一范式的基礎(chǔ)之上更進(jìn)一層。

第二范式需要確保數(shù)據(jù)庫(kù)表中的每一列都和主鍵相關(guān),而不能只與主鍵的某一部分相關(guān)(主要針對(duì)聯(lián)合主鍵而言)。

也就是說(shuō)在一個(gè)數(shù)據(jù)庫(kù)表中,一個(gè)表中只能保存一種數(shù)據(jù),不可以把多種數(shù)據(jù)保存在同一張數(shù)據(jù)庫(kù)表中。

第三范式3Nf:所有字段必須與主鍵直接相關(guān),而不是間接相關(guān)。

也可以理解為字段不要和其他非主鍵字段相關(guān).??注意:這三個(gè)范式盡可能去遵守,不是一定要墨守成規(guī).這只是讓我們?cè)O(shè)計(jì)的表的時(shí)候,越靠近這些范式,可以使字段盡量的減小冗余.但是有時(shí)候也可以根據(jù)實(shí)際需要小小的違背一下.但是第三范式違反一下還可以接受,但是第一范式別違反.??數(shù)據(jù)庫(kù)設(shè)計(jì)的步驟??需求分析階段??準(zhǔn)確了解與分析用戶(hù)需求(包括數(shù)據(jù)與處理)。

是整個(gè)設(shè)計(jì)過(guò)程的基礎(chǔ),是最困難、最耗費(fèi)時(shí)間的一步。

概念結(jié)構(gòu)設(shè)計(jì)階段??是整個(gè)數(shù)據(jù)庫(kù)設(shè)計(jì)的關(guān)鍵--設(shè)計(jì)數(shù)據(jù)庫(kù)的E-R模型圖,確認(rèn)需求信息的正確和完整??Entity_Relationship---實(shí)體之間的關(guān)系??一對(duì)一??一對(duì)多??多對(duì)一

北大青鳥(niǎo)java培訓(xùn):mysql數(shù)據(jù)庫(kù)的優(yōu)化方法?

我們都知道,服務(wù)器數(shù)據(jù)庫(kù)的開(kāi)發(fā)一般都是通過(guò)java或者是PHP語(yǔ)言來(lái)編程實(shí)現(xiàn)的,而為了提高我們數(shù)據(jù)庫(kù)的運(yùn)行速度和效率,數(shù)據(jù)庫(kù)優(yōu)化也成為了我們每日的工作重點(diǎn),今天,福建IT培訓(xùn)就一起來(lái)了解一下mysql服務(wù)器數(shù)據(jù)庫(kù)的優(yōu)化方法。

為什么要了解索引真實(shí)案例案例一:大學(xué)有段時(shí)間學(xué)習(xí)爬蟲(chóng),爬取了知乎300w用戶(hù)答題數(shù)據(jù),存儲(chǔ)到mysql數(shù)據(jù)中。

那時(shí)不了解索引,一條簡(jiǎn)單的“根據(jù)用戶(hù)名搜索全部回答的sql“需要執(zhí)行半分鐘左右,完全滿(mǎn)足不了正常的使用。

案例二:近線上應(yīng)用的數(shù)據(jù)庫(kù)頻頻出現(xiàn)多條慢sql風(fēng)險(xiǎn)提示,而工作以來(lái),對(duì)數(shù)據(jù)庫(kù)優(yōu)化方面所知甚少。

例如一個(gè)用戶(hù)數(shù)據(jù)頁(yè)面需要執(zhí)行很多次數(shù)據(jù)庫(kù)查詢(xún),性能很慢,通過(guò)增加超時(shí)時(shí)間勉強(qiáng)可以訪問(wèn),但是性能上需要優(yōu)化。

索引的優(yōu)點(diǎn)合適的索引,可以大大減小mysql服務(wù)器掃描的數(shù)據(jù)量,避免內(nèi)存排序和臨時(shí)表,提高應(yīng)用程序的查詢(xún)性能。

索引的類(lèi)型mysql數(shù)據(jù)中有多種索引類(lèi)型,primarykey,unique,normal,但底層存儲(chǔ)的數(shù)據(jù)結(jié)構(gòu)都是BTREE;有些存儲(chǔ)引擎還提供hash索引,全文索引。

BTREE是常見(jiàn)的優(yōu)化要面對(duì)的索引結(jié)構(gòu),都是基于BTREE的討論。

B-TREE查詢(xún)數(shù)據(jù)簡(jiǎn)單暴力的方式是遍歷所有記錄;如果數(shù)據(jù)不重復(fù),就可以通過(guò)組織成一顆排序二叉樹(shù),通過(guò)二分查找算法來(lái)查詢(xún),大大提高查詢(xún)性能。

而B(niǎo)TREE是一種更強(qiáng)大的排序樹(shù),支持多個(gè)分支,高度更低,數(shù)據(jù)的插入、刪除、更新更快。

現(xiàn)代數(shù)據(jù)庫(kù)的索引文件和文件系統(tǒng)的文件塊都被組織成BTREE。

btree的每個(gè)節(jié)點(diǎn)都包含有key,data和只想子節(jié)點(diǎn)指針。

btree有度的概念d=1。

假設(shè)btree的度為d,則每個(gè)內(nèi)部節(jié)點(diǎn)可以有n=[d+1,2d+1)個(gè)key,n+1個(gè)子節(jié)點(diǎn)指針。

樹(shù)的大高度為h=Logb[(N+1)/2]。

索引和文件系統(tǒng)中,B-TREE的節(jié)點(diǎn)常設(shè)計(jì)成接近一個(gè)內(nèi)存頁(yè)大小(也是磁盤(pán)扇區(qū)大小),且樹(shù)的度非常大。

這樣磁盤(pán)I/O的次數(shù),就等于樹(shù)的高度h。

假設(shè)b=100,一百萬(wàn)個(gè)節(jié)點(diǎn)的樹(shù),h將只有3層。

即,只有3次磁盤(pán)I/O就可以查找完畢,性能非常高。

索引查詢(xún)建立索引后,合適的查詢(xún)語(yǔ)句才能大發(fā)揮索引的優(yōu)勢(shì)。

另外,由于查詢(xún)優(yōu)化器可以解析客戶(hù)端的sql語(yǔ)句,會(huì)調(diào)整sql的查詢(xún)語(yǔ)句的條件順序去匹配合適的索引。

mysql數(shù)據(jù)庫(kù)如何優(yōu)化?誰(shuí)能給出點(diǎn)具體的解決方案?

1、explain:解釋sql的執(zhí)行計(jì)劃,后邊的sql不執(zhí)行

2、explain partitions :用于查看存在分區(qū)的表的執(zhí)行計(jì)劃

3、explain extended:待驗(yàn)證

4、show warnings:

5、show create table:查看表的詳細(xì)的創(chuàng)建語(yǔ)句,便于用戶(hù)對(duì)表進(jìn)行優(yōu)化

6、show indexes :產(chǎn)看表的所有索引,show indexes from table_name,同樣也可以從information_schema.statistics表中獲得同樣的信息。cardinality列很重要,表示數(shù)據(jù)量。

7、show tables status: 查看數(shù)據(jù)庫(kù)表的底層大小以及表結(jié)構(gòu),同樣可以從information_schema.tables表中獲得底層表的信息。

8、show [global|session]status:可以查看mysql服務(wù)器當(dāng)前內(nèi)部狀態(tài)信息。可以幫助卻行mysql服務(wù)器的負(fù)載的各種指標(biāo)。默認(rèn)是session。同information_schema.global_status和information_schema.session_status

9、show [global|session] variables :查看當(dāng)前mysql系統(tǒng)變量的值,其中一些值能影響到sql語(yǔ)句的執(zhí)行方式。同information_schema.global_variables和information_schema.session_variables;

10、information_schema:包含的表的數(shù)量和mysql的版本有關(guān)系。

超詳細(xì)MySQL數(shù)據(jù)庫(kù)優(yōu)化

數(shù)據(jù)庫(kù)優(yōu)化一方面是找出系統(tǒng)的瓶頸,提高M(jìn)ySQL數(shù)據(jù)庫(kù)的整體性能,而另一方面需要合理的結(jié)構(gòu)設(shè)計(jì)和參數(shù)調(diào)整,以提高用戶(hù)的相應(yīng)速度,同時(shí)還要盡可能的節(jié)約系統(tǒng)資源,以便讓系統(tǒng)提供更大的負(fù)荷.

1. 優(yōu)化一覽圖

2. 優(yōu)化

筆者將優(yōu)化分為了兩大類(lèi),軟優(yōu)化和硬優(yōu)化,軟優(yōu)化一般是操作數(shù)據(jù)庫(kù)即可,而硬優(yōu)化則是操作服務(wù)器硬件及參數(shù)設(shè)置.

2.1 軟優(yōu)化

2.1.1 查詢(xún)語(yǔ)句優(yōu)化

1.首先我們可以用EXPLAIN或DESCRIBE(簡(jiǎn)寫(xiě):DESC)命令分析一條查詢(xún)語(yǔ)句的執(zhí)行信息.

2.例:

顯示:

其中會(huì)顯示索引和查詢(xún)數(shù)據(jù)讀取數(shù)據(jù)條數(shù)等信息.

2.1.2 優(yōu)化子查詢(xún)

在MySQL中,盡量使用JOIN來(lái)代替子查詢(xún).因?yàn)樽硬樵?xún)需要嵌套查詢(xún),嵌套查詢(xún)時(shí)會(huì)建立一張臨時(shí)表,臨時(shí)表的建立和刪除都會(huì)有較大的系統(tǒng)開(kāi)銷(xiāo),而連接查詢(xún)不會(huì)創(chuàng)建臨時(shí)表,因此效率比嵌套子查詢(xún)高.

2.1.3 使用索引

索引是提高數(shù)據(jù)庫(kù)查詢(xún)速度最重要的方法之一,關(guān)于索引可以參高筆者M(jìn)ySQL數(shù)據(jù)庫(kù)索引一文,介紹比較詳細(xì),此處記錄使用索引的三大注意事項(xiàng):

2.1.4 分解表

對(duì)于字段較多的表,如果某些字段使用頻率較低,此時(shí)應(yīng)當(dāng),將其分離出來(lái)從而形成新的表,

2.1.5 中間表

對(duì)于將大量連接查詢(xún)的表可以創(chuàng)建中間表,從而減少在查詢(xún)時(shí)造成的連接耗時(shí).

2.1.6 增加冗余字段

類(lèi)似于創(chuàng)建中間表,增加冗余也是為了減少連接查詢(xún).

2.1.7 分析表,,檢查表,優(yōu)化表

分析表主要是分析表中關(guān)鍵字的分布,檢查表主要是檢查表中是否存在錯(cuò)誤,優(yōu)化表主要是消除刪除或更新造成的表空間浪費(fèi).

1. 分析表: 使用 ANALYZE 關(guān)鍵字,如ANALYZE TABLE user;

2. 檢查表: 使用 CHECK關(guān)鍵字,如CHECK TABLE user [option]

option 只對(duì)MyISAM有效,共五個(gè)參數(shù)值:

3. 優(yōu)化表:使用OPTIMIZE關(guān)鍵字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不寫(xiě)入日志.,優(yōu)化表只對(duì)VARCHAR,BLOB和TEXT有效,通過(guò)OPTIMIZE TABLE語(yǔ)句可以消除文件碎片,在執(zhí)行過(guò)程中會(huì)加上只讀鎖.

2.2 硬優(yōu)化

2.2.1 硬件三件套

1.配置多核心和頻率高的cpu,多核心可以執(zhí)行多個(gè)線程.

2.配置大內(nèi)存,提高內(nèi)存,即可提高緩存區(qū)容量,因此能減少磁盤(pán)I/O時(shí)間,從而提高響應(yīng)速度.

3.配置高速磁盤(pán)或合理分布磁盤(pán):高速磁盤(pán)提高I/O,分布磁盤(pán)能提高并行操作的能力.

2.2.2 優(yōu)化數(shù)據(jù)庫(kù)參數(shù)

優(yōu)化數(shù)據(jù)庫(kù)參數(shù)可以提高資源利用率,從而提高M(jìn)ySQL服務(wù)器性能.MySQL服務(wù)的配置參數(shù)都在my.cnf或my.ini,下面列出性能影響較大的幾個(gè)參數(shù).

2.2.3 分庫(kù)分表

因?yàn)閿?shù)據(jù)庫(kù)壓力過(guò)大,首先一個(gè)問(wèn)題就是高峰期系統(tǒng)性能可能會(huì)降低,因?yàn)閿?shù)據(jù)庫(kù)負(fù)載過(guò)高對(duì)性能會(huì)有影響。另外一個(gè),壓力過(guò)大把你的數(shù)據(jù)庫(kù)給搞掛了怎么辦?所以此時(shí)你必須得對(duì)系統(tǒng)做分庫(kù)分表 + 讀寫(xiě)分離,也就是把一個(gè)庫(kù)拆分為多個(gè)庫(kù),部署在多個(gè)數(shù)據(jù)庫(kù)服務(wù)上,這時(shí)作為主庫(kù)承載寫(xiě)入請(qǐng)求。然后每個(gè)主庫(kù)都掛載至少一個(gè)從庫(kù),由從庫(kù)來(lái)承載讀請(qǐng)求。

2.2.4 緩存集群

如果用戶(hù)量越來(lái)越大,此時(shí)你可以不停的加機(jī)器,比如說(shuō)系統(tǒng)層面不停加機(jī)器,就可以承載更高的并發(fā)請(qǐng)求。然后數(shù)據(jù)庫(kù)層面如果寫(xiě)入并發(fā)越來(lái)越高,就擴(kuò)容加數(shù)據(jù)庫(kù)服務(wù)器,通過(guò)分庫(kù)分表是可以支持?jǐn)U容機(jī)器的,如果數(shù)據(jù)庫(kù)層面的讀并發(fā)越來(lái)越高,就擴(kuò)容加更多的從庫(kù)。但是這里有一個(gè)很大的問(wèn)題:數(shù)據(jù)庫(kù)其實(shí)本身不是用來(lái)承載高并發(fā)請(qǐng)求的,所以通常來(lái)說(shuō),數(shù)據(jù)庫(kù)單機(jī)每秒承載的并發(fā)就在幾千的數(shù)量級(jí),而且數(shù)據(jù)庫(kù)使用的機(jī)器都是比較高配置,比較昂貴的機(jī)器,成本很高。如果你就是簡(jiǎn)單的不停的加機(jī)器,其實(shí)是不對(duì)的。所以在高并發(fā)架構(gòu)里通常都有緩存這個(gè)環(huán)節(jié),緩存系統(tǒng)的設(shè)計(jì)就是為了承載高并發(fā)而生。所以單機(jī)承載的并發(fā)量都在每秒幾萬(wàn),甚至每秒數(shù)十萬(wàn),對(duì)高并發(fā)的承載能力比數(shù)據(jù)庫(kù)系統(tǒng)要高出一到兩個(gè)數(shù)量級(jí)。所以你完全可以根據(jù)系統(tǒng)的業(yè)務(wù)特性,對(duì)那種寫(xiě)少讀多的請(qǐng)求,引入緩存集群。具體來(lái)說(shuō),就是在寫(xiě)數(shù)據(jù)庫(kù)的時(shí)候同時(shí)寫(xiě)一份數(shù)據(jù)到緩存集群里,然后用緩存集群來(lái)承載大部分的讀請(qǐng)求。這樣的話(huà),通過(guò)緩存集群,就可以用更少的機(jī)器資源承載更高的并發(fā)。

一個(gè)完整而復(fù)雜的高并發(fā)系統(tǒng)架構(gòu)中,一定會(huì)包含:各種復(fù)雜的自研基礎(chǔ)架構(gòu)系統(tǒng)。各種精妙的架構(gòu)設(shè)計(jì).因此一篇小文頂多具有拋磚引玉的效果,但是數(shù)據(jù)庫(kù)優(yōu)化的思想差不多就這些了.


當(dāng)前題目:怎么優(yōu)化mysql數(shù)據(jù)庫(kù),Mysql數(shù)據(jù)庫(kù)優(yōu)化
轉(zhuǎn)載注明:http://weahome.cn/article/hcpijs.html

其他資訊

在線咨詢(xún)

微信咨詢(xún)

電話(huà)咨詢(xún)

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部