溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

mysql性能優(yōu)化主要有哪些問題

發(fā)布時(shí)間:2020-05-11 15:21:14 來源:億速云 閱讀:301 作者:三月 欄目:MySQL數(shù)據(jù)庫

下面講講關(guān)于mysql性能優(yōu)化主要有哪些問題,文字的奧妙在于貼近主題相關(guān)。所以,閑話就不談了,我們直接看下文吧,相信看完mysql性能優(yōu)化主要有哪些問題這篇文章你一定會(huì)有所受益。                                                         

A、表的是設(shè)計(jì)合理化(符合 3范式)

B、添加適當(dāng)?shù)乃饕?index)[四種:普通索引,主鍵索引,唯一索引,unique,全文索引]

C、分表技術(shù)(水平分割,垂直分割)

D、讀寫[寫:update/delete/add]分離

E、存儲(chǔ)過程[模塊化編程,可以提高速度]

F、對(duì)mysql配置優(yōu)化[配置最大并發(fā)數(shù),my.ini調(diào)整緩存大小]

G、Mysql云服務(wù)器引薦升級(jí)

H、定時(shí)的去清楚不需要的數(shù)據(jù),定時(shí)進(jìn)行碎片整理

1、數(shù)據(jù)庫表的設(shè)計(jì)

第一范式:1NF是對(duì)屬性的原子性約束,要求屬性(列)具有原子性,不可再分解;(只要是關(guān)系型數(shù)據(jù)庫都滿足1NF)

第二范式:2NF是對(duì)記錄的惟一性約束,要求記錄有惟一標(biāo)識(shí),即實(shí)體的惟一性;

第三范式:3NF是對(duì)字段冗余性的約束,它要求字段沒有冗余。沒有冗余的數(shù)據(jù)庫設(shè)計(jì)可以做到。

2、sql優(yōu)化的一般步驟

操作步驟:

1、通過show status命令了解各種SQL的執(zhí)行頻率。

2、 定位執(zhí)行效率較低的SQL語句-(重點(diǎn)select)

3、 通過explain分析低效率的SQL語句的執(zhí)行情況

4、確定問題并采取相應(yīng)的優(yōu)化措施

MySQL通過使用show [session|global] status 命令可以提供云服務(wù)器狀態(tài)信息。

mysql性能優(yōu)化主要有哪些問題

session來表示當(dāng)前的連接的統(tǒng)計(jì)結(jié)果,global來表示自數(shù)據(jù)庫上次啟動(dòng)至今的統(tǒng)計(jì)結(jié)果。默認(rèn)是session級(jí)別的。

show status like ‘Com_%’;

其中Com_XXX表示XXX語句所執(zhí)行的次數(shù)。Eg:Com_insert,Com_Select…
重點(diǎn)注意:Com_select,Com_insert,Com_update,Com_delete通過這幾個(gè)參數(shù),可以容易地了解到當(dāng)前數(shù)據(jù)庫的應(yīng)用是以插入更新為主還是以查詢操作為主,以及各類的SQL大致的執(zhí)行比例是多少。
Connections:試圖連接MySQL云服務(wù)器的次數(shù)
Uptime:云服務(wù)器工作的時(shí)間(單位秒)
Slow_queries:慢查詢的次數(shù) (默認(rèn)是慢查詢時(shí)間10s)

Show status like‘Handler_read%’使用查詢的次數(shù)

mysql性能優(yōu)化主要有哪些問題

定位慢查詢:

在默認(rèn)的情況下mysql是不記錄滿查詢?nèi)罩镜?,需要在啟?dòng)的時(shí)候指定

\bin\mysqld.exe- -safe-mode – slow-query-log[mysql5.5可以在my.ini中指定]

\bin\mysqld.exe- -log-slow-queries=d:bac.log

具體操作如下:

如果啟用了慢查詢,默認(rèn)存儲(chǔ)在mysql.ini文件的此處

mysql性能優(yōu)化主要有哪些問題

1、重啟mysql,找到datadir的路勁,使用cmd進(jìn)入到data的上級(jí)目錄

2、運(yùn)行命令\bin\mysqld.exe –safe-mode  –slow-query-log(注意執(zhí)行前先關(guān)閉mysql服務(wù))

3、生成的日志文件記錄著所有的記錄信息

顯示慢查詢的時(shí)間:Show variables like ‘long_query_time’;

重新設(shè)置滿查詢的時(shí)間:Set long_query_time=2;

修改命令結(jié)束符:(為了存儲(chǔ)過程能夠正常執(zhí)行,我們需要把命令結(jié)束符號(hào)進(jìn)行修修改)

Delimiter $$

如何把慢查詢的sql語句記錄到我們的日志中(默認(rèn)情況下mysql是不會(huì)記錄的,需要在啟動(dòng)mysql的時(shí)候,指定慢查詢的)。

3、索引

?索引的類型:

★四種索引①主鍵索引②唯一索引③普通索引④全文索引

一、添加

1.1主鍵索引添加

當(dāng)把一張表的某列設(shè)置為主鍵的時(shí)候,則該列就是主鍵索引。

Createtable aaa(id int unsigned primary key auto_increment,

name varchar(32) not null default);

1.2普通索引

一般來說,普通索引是先創(chuàng)建表,然后創(chuàng)建普通索引。

比如:

Createindex索引名 from表名

1.3創(chuàng)建全文索引

全文索引,主要是針對(duì)文件,比如文章的索引全文索引針對(duì)MyISAM有用,針對(duì)innodb沒有用

Create table articles(

Id int unsignedauto_increment not null primary key,

Title varchar(20),

Body text,

Fulltext (title,body)

)engine=myisam charsetutf8;

錯(cuò)誤用法:

Select * from articles where body like ‘%mysql%’[不會(huì)使用到全文索引]

證明:

Explain select * from articles body like ‘%mysql%’;

正確的用法:

Select * from article wherematch(title,body)against(‘database’);[可以]

說明:

1、在mysql中fulltest索引值針對(duì)myisam生效

2、針對(duì)英文生效,àsphinx(coreseek)技術(shù)處理中文

3、使用的方法,match(字段名,…)against(‘關(guān)鍵詞’)

4、全文索引一個(gè)叫停止詞。因?yàn)樵谝粋€(gè)文本中,創(chuàng)建索引的是一個(gè)無窮大的書,因此,對(duì)一些常用詞和字符就不會(huì)創(chuàng)建,這些詞,稱之為停止詞

1.4創(chuàng)建唯一索引

當(dāng)表的某列被指定為unique約束時(shí),這列就是唯一索引

第一種、Create table ddd(id int primary keyauto_increment,name varchar(32) unique);

這時(shí),name默認(rèn)就是唯一索引

第二種、create table eee(id int primary keyauto_increment,name varchar(32));

Createunique index索引名 on表名(列名)

簡(jiǎn)單的說:PRIMARY KEY=UNIQUE+NOT NULL

Unique字段可以為null,并可以有多個(gè)null,但是如果是具體內(nèi)容,則不能重復(fù)

主鍵字段,不能為null,也不能重復(fù)

二、查詢

1.Desc表名[該方法的缺點(diǎn),不能夠現(xiàn)實(shí)索引名]

2.Show index from表名;

select index from表名\G

3.show keys from表名

三、刪除

Altertable 表名 drop  index 索引名,

Altertable 表名 drop primary key。(刪除主鍵索引名)

四、修改

先刪除,在全部

二、針對(duì)SQL編寫導(dǎo)致的慢 SQL,優(yōu)化起來還是相對(duì)比較方便的。正如上一節(jié)提到的正確的使用索引能加快查詢速度,那么我們?cè)诰帉?SQL 時(shí)就需要注意與索引相關(guān)的規(guī)則:

1.字段類型轉(zhuǎn)換導(dǎo)致不用索引,如字符串類型的不用引號(hào),數(shù)字類型的用引號(hào)等,這有可能會(huì)用不到索引導(dǎo)致全表掃描;

2.mysql 不支持函數(shù)轉(zhuǎn)換,所以字段前面不能加函數(shù),否則這將用不到索引;

3.不要在字段前面加減運(yùn)算;

4.字符串比較長(zhǎng)的可以考慮索引一部份減少索引文件大小,提高寫入效率;

5.like % 在前面用不到索引;

6.根據(jù)聯(lián)合索引的第二個(gè)及以后的字段單獨(dú)查詢用不到索引;

7.不要使用 select *;

8.排序請(qǐng)盡量使用升序 ;

9.or 的查詢盡量用 union 代替(Innodb);

10.復(fù)合索引高選擇性的字段排在前面;

11.order by / groupby 字段包括在索引當(dāng)中減少排序,效率會(huì)更高。

除了上述索引使用規(guī)則外,SQL 編寫時(shí)還需要特別注意一下幾點(diǎn):

1.盡量規(guī)避大事務(wù)的 SQL,大事務(wù)的 SQL 會(huì)影響數(shù)據(jù)庫的并發(fā)性能及主從同步;

2.分頁語句 limit 的問題;

3.刪除表所有記錄請(qǐng)用 truncate,不要用 delete;

4.不讓 mysql 干多余的事情,如計(jì)算;

5.輸寫 SQL 帶字段,以防止后面表變更帶來的問題,性能也是比較優(yōu)的 ( 涉及到數(shù)據(jù)字典解析,請(qǐng)自行查詢資料);

6.在 Innodb上用 select count(*),因?yàn)?Innodb 會(huì)存儲(chǔ)統(tǒng)計(jì)信息;

7.慎用 Oder by rand()。

三、顯示慢查詢的次數(shù):show status like 'slow_queries';

mysql性能優(yōu)化主要有哪些問題


mysql性能優(yōu)化主要有哪些問題

HEAP是較早的mysql版本

四、Explain分析低效率的SQL語句:

mysql性能優(yōu)化主要有哪些問題

會(huì)產(chǎn)生如下信息:

select_type:表示查詢的類型。

table:輸出結(jié)果集的表

type:表示表的連接類型

possible_keys:表示查詢時(shí),可能使用的索引

key:表示實(shí)際使用的索引

key_len:索引字段的長(zhǎng)度

rows:掃描出的行數(shù)(估算的行數(shù))

Extra:執(zhí)行情況的描述和說明

Select_type類型:

primary : 子查詢中最外層查詢

subquery : 子查詢內(nèi)層第一個(gè)select,結(jié)果不依賴于外部查詢

dependent subquery : 子查詢內(nèi)層第一個(gè)select,依賴于外部查詢

union:union語句中第二個(gè)select開始后面所有select

simple: 簡(jiǎn)單模式

union result: union中合并結(jié)果

type 類型:

all: 完整的表掃描 通常不好

system : 表僅有一行(=系統(tǒng)表) 這是const聯(lián)接類型的一個(gè)特例

const : 表最多有一個(gè)匹配行

extra 類型:

no table: query語句中使用 from dual 或不含任何from子句

Using filesort : 當(dāng)query中包含 order by 操作,而且無法利用索引完成排序

impossible WHERE noticed after readingconst tables:Mysql query optimizer

通過收集統(tǒng)計(jì)信息不可能存在結(jié)果

Using temporary : 某些操作必須使用臨時(shí)表,常見 group by ,order by

Using where: 不用讀取表中所有信息,僅通過索引就可以獲取所需數(shù)據(jù)

4、為什么使用了索引后查詢速度會(huì)變快

普通的查詢?nèi)绻麤]有索引,他會(huì)一直去執(zhí)行,及時(shí)匹配到了還要繼續(xù)查詢,不能保證后面有沒有要查詢的。要全文索引。

mysql性能優(yōu)化主要有哪些問題

mysql性能優(yōu)化主要有哪些問題

■索引使用的注意事項(xiàng)

索引的代價(jià):

1、占用磁盤空間

2、對(duì)DML(insert,update,create)操作有影響,變慢

■總結(jié):滿足以下條件,才應(yīng)該創(chuàng)建索引

A、肯定在where經(jīng)常使用

B、該字段的內(nèi)容不是唯一的幾個(gè)值(sex)

C、字段內(nèi)容不是頻繁變化

■使用索引的注意事項(xiàng):

alter table dept add index myind (dname,loc); // dname就是左邊的列,loc是右邊的列

下列情況有可能使用到索引

a.對(duì)于創(chuàng)建的多列索引,只要查詢條件使用了最左邊的列,索引一般就會(huì)被使用 explain select * from dept where dname='aaa';

b.對(duì)于使用like的查詢,查詢條件如果是'%aaa'則不會(huì)使用到索引,'aaa%'會(huì)使用到索引

下列情況不會(huì)使用索引 :

a.如果條件中有or,即使其中有條件帶索引也不會(huì)使用換言之,就是要求使用的所有字段都創(chuàng)建索引,建議:盡量避免使用or關(guān)鍵字

b.對(duì)于多列索引,不是使用的第一部分,則不會(huì)使用索引

explain select * from dept where loc='aaa';// 多列索引時(shí),loc為右邊列,索引不會(huì)使用到

c.like查詢是以%開頭如果一定要使用,則使用全文索引去查詢

d.如果列類型是字符串,那一定要在條件中將數(shù)據(jù)使用引號(hào)引起來,否則不使用索引

e.如果MySQL估計(jì)使用全表掃描要比使用索引塊,則不使用索引

如何選擇mysql的存儲(chǔ)引擎
        1:myISAM

如果表對(duì)事務(wù)的要求不高,同事一查詢和添加為主的,

比如BBS中的發(fā)帖,回帖。

2:InnoDB

對(duì)事務(wù)的要求高,保存的數(shù)據(jù)都是重要數(shù)據(jù),

比如訂單,賬戶表

3:Memory:

數(shù)據(jù)變化頻繁,不需要入庫同時(shí)又進(jìn)場(chǎng)查詢和修改。

myISAM和InnoDB的區(qū)別:

1、myISAM批量插入快,InnoDB插入慢,myISAM插入時(shí)候不排序。

2、InnoDB支持事務(wù),myISAM不支持事務(wù)。

3、MyISAM支持全文索引,

4、鎖機(jī)制,myISAM是表鎖,InnoDB是行鎖

5、myISAM不支持外鍵,InnoDB支持外健

① 在進(jìn)度要求高的應(yīng)用中,建議使用定點(diǎn)數(shù)據(jù)來存儲(chǔ)數(shù)值,組U一保證數(shù)據(jù)的準(zhǔn)確性,deciaml進(jìn)度比float高,盡量使用

②  對(duì)于存儲(chǔ)引擎的myISAM的數(shù)據(jù)庫,如果進(jìn)場(chǎng)要走刪除和修改的操作,要定時(shí)執(zhí)行optimize_table_name功能對(duì)表進(jìn)行碎片整理。

③  日期類型要根據(jù)實(shí)際需要選擇引用的最小存儲(chǔ)的早期類型,

手動(dòng)備份數(shù)據(jù)庫:

1、進(jìn)入cmd

2、Mysqldump –uroot –proot數(shù)據(jù)庫【表名1,表名2…】 > 文件路徑

Eg: mysqldump -uroot -proot temp > d:/temp.bak

恢復(fù)備份文件數(shù)據(jù):

Source d:/temp.bak(在mysql控制臺(tái))

合理的硬件資源和操作系統(tǒng)

Master

Slave1

Slave2

Slave3

主庫master用來寫入,slave1—slave3都用來做select,每個(gè)數(shù)據(jù)庫

分擔(dān)的壓力小了很多。

要實(shí)現(xiàn)這種方式,需要程序特別設(shè)計(jì),寫都操作master,讀都操作

slave,給程序開發(fā)帶來了額外負(fù)擔(dān)。當(dāng)然目前已經(jīng)有中間件來實(shí)現(xiàn)這個(gè)

代理,對(duì)程序來讀寫哪些數(shù)據(jù)庫是透明的。官方有個(gè)mysql-proxy,但是

還是alpha版本的。新浪有個(gè)amobe for mysql,也可達(dá)到這個(gè)目的,結(jié)構(gòu)

如下:

mysql性能優(yōu)化主要有哪些問題

5、表的分割

水平分割:

大數(shù)據(jù)量的表,我們?cè)谔峁z索的時(shí)候,應(yīng)該根據(jù)業(yè)務(wù)的需求,找到表的標(biāo)準(zhǔn),并在檢索頁面約束用戶的檢索方式,而且要配合分頁,

案例:大數(shù)據(jù)量的用戶表

三張表:qqlogin0,qqlogin1,qqlogin2

將用戶id%3,按結(jié)果放入不同的表當(dāng)中

create tableqqlogin0(

id int unsigned not null primary key,/* 這個(gè)id不能設(shè)置自增長(zhǎng) */

name varchar(32)not null default'',

pwd varchar(32)not null default''

)engine = myisam default charset = utf8;

創(chuàng)建表qqlogin1(

id int unsigned not null主鍵,/ *這個(gè)id不能設(shè)置自增長(zhǎng)* /

name varchar(32)not null default'',

pwd varchar(32)not null default''

)engine = myisam default charset = utf8;

創(chuàng)建表qqlogin2(

id int unsigned not null主鍵,/ *這個(gè)id不能設(shè)置自增長(zhǎng)* /

name varchar(32)not null default'',

pwd varchar(32)not null default''

)engine = myisam default charset = utf8;

垂直分割:

把某個(gè)表的某些字段,這些字段,在查詢時(shí)候并不關(guān)系,但是數(shù)據(jù)量很大,我們建議將這些字段放到一個(gè)表中,從而提高效率

6、優(yōu)化的mysql的配置

MY.INI

port = 3306默認(rèn)端口是3306,

如果想修改端口port = 3309,在mysql_connect('localhost:3309','root','root');要注意

query_cache_size = 15M這個(gè)是查詢緩存的大小

InnoDB的參數(shù)也可以調(diào)大以下兩個(gè)參數(shù)

innodb_additional_mem_pool_size = 64M

innodb_buffer_pool_size = 1G

myisam需要調(diào)整key_buffer_size

調(diào)整參數(shù)還要看狀態(tài),用show status可以看到當(dāng)前狀態(tài),以決定該調(diào)整哪些參數(shù)

7、增量備份

實(shí)際案例:

如何進(jìn)行增量備份,和恢復(fù)

步驟:

如圖1所示,配置的my.ini文件或者是my.cof,啟用二進(jìn)制備份

mysql性能優(yōu)化主要有哪些問題

2,重新啟動(dòng)的MySQL

啟動(dòng)之后會(huì)發(fā)現(xiàn)mylog目錄下生成了一下文件

mysql性能優(yōu)化主要有哪些問題

其中:E:\二進(jìn)制日志\ mylog.index索引文件,有哪些備份文件

E:\二進(jìn)制日志\ mylog.000001存放用戶對(duì)象數(shù)據(jù)庫操作的文件

3,當(dāng)我們進(jìn)行操作的時(shí)候(選擇)

查看需要進(jìn)入到MySQL的的安裝目錄下的bin中,然后執(zhí)行mysqlbinlog可以文件,后面追加文件路徑

mysql性能優(yōu)化主要有哪些問題

mysql性能優(yōu)化主要有哪些問題

如圖4所示,恢復(fù)到某個(gè)語句的時(shí)間點(diǎn)

4,1按照時(shí)間點(diǎn)回復(fù)

Mysqlbinlog -stop-datetime =“2013-01-17 12:00:23”d:/binlog/mylog.000001 | mysq -uroot -p

(恢復(fù)到停止時(shí)間之前的所有數(shù)據(jù))

Mysqlbinlog-start-datetime =“2013-01-17 12:00:23”d:/binlog/mylog.000001 | mysq -uroot -p

(恢復(fù)開始時(shí)間到之后的所有數(shù)據(jù))

4,2按照位置恢復(fù)

Mysqlbinlog-stop-position =“234”d:/binlog/mylog.000001 | mysq -uroot -p

(恢復(fù)到停止時(shí)間之前的所有數(shù)據(jù))

Mysqlbinlog-start-position =“234”d:/binlog/mylog.000001 | mysq -uroot -p

(恢復(fù)開始時(shí)間到之后的所有數(shù)據(jù))

對(duì)于以上mysql性能優(yōu)化主要有哪些問題內(nèi)容,大家還有什么不明白的地方嗎?或者想要了解更多相關(guān),可以繼續(xù)關(guān)注我們的行業(yè)資訊板塊。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI