1. 程式人生 > >mysql索引的使用及優化方法

mysql索引的使用及優化方法

資料庫高階管理及優化

MySQL效能優化

優化MySQL資料庫是資料庫管理員和資料庫開發人員的必備技能。優化MySQL,一方面是找出系統的瓶頸,提高MySQL資料庫整體的效能;另一方面是合理設計結構和調整引數,以提高使用者操作響應的速度。同時還要儘可能節省系統資源,以便系統可以提供更大負荷的服務。

MySQL資料庫優化是多方面的,原則是減少系統的瓶頸,減少資源的佔用,提高系統的反應速度。例如,通過優化檔案系統,提高磁碟的讀寫速度;通過優化作業系統排程策略,提高MySQL在高負荷情況下的負載能力;通過優化表結構、索引、查詢語句等,使查詢響應更快。我們這裡只講第三點

MySQL中可以使用

show status語句查詢MySQL資料庫的一些效能引數。其語法如下:

Show status like ‘value’;

其中value是要查詢的引數值,常用的一些效能引數如下:

Connections :連線MySQL伺服器的時間

Uptime : MySQL伺服器的上線時間

Slow_ queries :慢查詢的次數

Com_select : 查詢操作的次數

Com_insert :插入操作的次數

Com_update:更新操作的次數

Com_delete :刪除操作的次數

對資料庫的優化有倆個方面:優化查詢(使用索引、使用連線查詢代替子查詢)和優化資料庫表結構

優化查詢

使用MySQL自帶的關鍵字explaindescribedesc)可以對查詢語句進行分析 如下:

 

其中比較關鍵的是rows該引數十分重要代表了本次查詢遍歷了多少行資料。

使用索引進行查詢:

前面已經介紹過了索引的用法這裡不再贅述,只是比較一下使用索引與不使用索引查詢的區別:

不用索引查詢成績表中成績為90的所有資訊

 

Key代表的是使用索引的名字,這裡為null表示沒有使用索引,rows9表示本次查詢遍歷了9行資料。

使用索引查詢成績表中成績為90的所有資訊

 

Key代表使用的索引名,rows2表示本次查詢只遍歷了2行(要知道我的成績表中總的資料量只有

9條)與不用索引對比簡直天壤之別。

索引可以提高查詢速度,但並不是使用帶有索引的欄位查詢時索引都會起作用,一下幾種情況索引不會起作用:

1、如果在成績表中給score欄位設定索引,但查詢時where條件使用的是一個範圍而不是一個確切的值時,索引無效,如:

 

2、在子查詢中,主句連線的索引無效,子句連線的索引有效

如:select * from student where id in (select studentid from score where score>90);

即此處id的索引無效,studentid的索引有效,如圖

 

主句的keynull,子句的keystuid索引。

3、使用like關鍵字進行查詢時,如果匹配字串的第一個字元為“%”,索引不會起作用,
%”不在第一個位置索引才會起作用

 

4、使用多列索引查詢語句

對於多列索引,只有在查詢條件中使用了這些欄位中的第一個欄位時,索引才會被使用。

5、使用or關鍵字的查詢語句

查詢語句的條件中只有OR時,並且OR前後的倆個條件中的列都是索引時,查詢中才使用索引,否則不使用索引。

優化子查詢

使用連線查詢(join)代替子查詢可以提高查詢效率。

MySQL4.1版開始支援子查詢(一個查詢的結果作為另一個select子句的條件),子查詢雖然靈活但執行效率不高,因為使用子查詢時,MySQL需要為內層查詢語句的查詢結果建立一個臨時表,然後外層查詢語句從臨時表中查詢記錄,查詢完畢後 再撤銷這些臨時表,因此子查詢的速度會相應的受到影響。而連線查詢不需要建立臨時表其查詢速度快於子查詢!

優化資料庫表結構

1、將欄位較多的表分解成多個表

對於欄位較多的表,如果有些欄位的使用頻率很低,可以將這些欄位分離出來形成新表。因為當一個表的資料量很大時,會由於存在使用頻率低的欄位而使查詢速度變慢。

2、增加中間表

對於經常需要聯合查詢的表,可以建立中間表以提高查詢效率。通過建立中間表,把需要經常聯合查詢的資料插入中間表,然後將原來的聯合查詢改為對中間表的查詢,以此來提高查詢效率。

3、增加冗餘欄位

設計資料庫表時應儘量遵循正規化理論的規約,儘可能減少冗餘欄位,讓資料庫表的設計看起來精緻、優雅。但是,合理地加入冗餘欄位可以提高查詢速度。如:員工資訊儲存在staff表中,部門資訊儲存在department表中。通過staff表中的department_id欄位與department表建立關係,如果要查詢一個員工所在的部門的名稱,必須從staff表中找到員工所在部門的編號(department_id),然後根據這個編號在department表中查詢部門名稱,如果經常需要這個操作,連線查詢便會浪費很多時間。可以在staff表中增加一個冗餘欄位department_name,該欄位用於儲存員工所在部門的名稱,這樣就不用每次都進行連線查詢操作了。

4、優化插入記錄的速度

innoDB引擎的表常見的優化方法

(1)、禁用唯一性檢查

插入資料時,MySQL會對插入的記錄進行唯一性校驗。這種唯一性校驗會降低插入記錄的速度。為了降低這種情況對查詢速度的影響可以在插入記錄之前禁用唯一性檢查,等到記錄插入完畢後再開啟。

Set  unique_check=0; 開啟唯一性檢查的語句如下:set  unique_checks=1;

(2)、禁用外來鍵檢查

插入資料之前禁止對外來鍵的檢查,資料插入完成之後再恢復對外來鍵的檢查。

Set foreign_key_checks=0; 恢復外來鍵檢查:set foreign_key_checks=1;

(3)、禁止自動提交

插入資料之前禁止事務的自動提交,資料匯入之後,執行恢復自動提交操作。

禁止自動提交的語句 set autocommit=0;恢復自動提交:set autocommit=1;

Myisam引擎表常見的優化方法

(1)、禁用索引 alter table table_name disable keys

開啟索引 alter table table_name enable keys

(2)禁用唯一性檢查

(3)使用批量插入

(4)當需要批量匯入資料時,使用load data infile

5、分析、檢查和優化表

MySQL提供了分析。檢查和優化表的語句。分析表主要是分析關鍵字的分佈,檢查表主要是檢查表是否存在錯誤,優化表主要是消除刪除或者更新造成的空間浪費。

(1)分析表:

innoDBmyisamBDB型別的表有效

Analyze table talbename;分析期間資料庫系統會為表加一個只讀鎖。

(2)檢查表

CheckinnoDBmyisam型別的表有效

Check table tablename option={quick | fast | medium | extended | changed}

Quick:不掃描行,不檢查錯誤的連線

Fast:只檢查沒有被正確關閉的表

Changed:只檢查上次檢查後被更改的表和沒有被正確關閉的表

Medium:掃描行,以驗證被刪除的連線是有效的,也可以計算各行的關鍵字校驗和,並使用計算出的校驗和驗證這一點。

Extended:對每行的所有關鍵字進行全面的關鍵字查詢,這可以確保表是100%一致的,但是用時較長。

(3)優化表

innoDBmyisam型別的表有效

Optimize table tablename  可以刪除和更新造成的檔案碎片。

6、優化MySQL的引數

通過優化MySQL的引數可以提高資源利用率,從而達到提高MySQL伺服器效能的目的。MySQL服務的配置引數都在my.cnf或者my.ini檔案的【MySQL】組中,下面介紹對效能影響比較大的幾個引數:

Key_buffer_size : 表示索引緩衝區的大小。索引緩衝區所有的執行緒共享。增加索引緩衝區可以得到更好處理的索引。當然該值也不是越大越好,它的大小取決於記憶體的大小(如果該值太大,導致作業系統頻繁換頁,也會降低系統的效能)

Table_cache:表示同時開啟的表的個數。這個值越大,能夠同時開啟的表就越多,但同時開啟的表越多會影響作業系統的效能。

Query_cache_size:表示查詢緩衝區的大小,該引數需要和query_cache_type配合使用。當query_cache_type的值是0時,所有的查詢都不使用查詢緩衝區。但是query_cache_type=0並不會導致MySQL釋放query_cache_size所配置的緩衝區的記憶體。當query_cache_type=1時,所有的查詢都將使用查詢緩衝區。除非在查詢語句中加select sql_no_cache * from tablename query_cache_type=2時,除非在查詢中使用sql_cache 關鍵字,否則查詢不會使用緩衝區。使用查詢緩衝區可以提高查詢的速度,這種方式只適用修改操作少並且經常執行相同的查詢操作的情況。

Sort_buffer_size:表示排序緩衝區的大小,這個值越大進行排序的速度越快。

Read_buffer_size:表示每個執行緒連續掃描時為掃描的每個表分配的緩衝區的大小。當執行緒從表中連續讀取資料時會用到該緩衝區。

Read_rnd_buffer_size:表示為每個執行緒保留的快取區的大小,與Read_buffer_size相似。但主要用於儲存按特定順序讀取出來的記錄。

Innodb_buffer_pool_size:表示InnoDB型別的表和索引的最大快取。這個值越大,查詢的速度就會越快,但這個值太大會影響作業系統的效能。

Max_connections:表示資料庫的最大連線數。這個資料不是越大越好,因為這些連結會浪費記憶體資源,過多的連線可能會導致MySQL伺服器僵死。

Innodb_flush_log_at_trx_commit:表示何時將緩衝區的資料寫入日誌檔案,並且將日誌檔案寫入磁碟。該引數對於innoDB引擎非常重要。該引數有3個值,分別為012.值為0時表示每隔一秒將資料寫入日誌檔案並將日誌寫入磁碟;值為1時表示每次提交事務時將資料寫入日誌檔案並將日誌檔案寫入磁碟;值為2時表示每次提交事務時將資料寫入磁碟,每隔一秒將日誌檔案寫入磁碟。該引數的預設值為1,值為1時安全性最高,但是每次事務提交或事務外的指令都需要把日誌寫入硬碟,是比較費時的;值為0時更快一些,但安全方面比較差;值為2時日誌仍然會每秒都寫入硬碟,所以即使出現故障,一般也不會丟失超過1~2秒的更新。

Back_log:表示在MySQL暫時停止回答新請求之前的短時間內,多少個請求可以被存在堆疊中。換句話說,該值表示到來的TCP/IP連線的偵聽佇列的大小。

Interactive_timeout:表示伺服器在關閉連線前等待行動的秒數。

Sort_buffer_size:表示每個需要進行排序的執行緒分配的緩衝區的大小,增加這個引數可以提高order bygroup by操作的速度。

Thread_cache_size:表示可以複用的執行緒的數量。

Wait_timeout:表示伺服器在關閉一個連線時等待行動的秒數。

資料庫備份

1、使用mysqldump命令備份

MysqldumpMySQL提供的一個非常有用的資料備份工具,執行MySQLdump命令時,可以將資料備份成一個文字檔案。

對整個資料庫備份語法為:mysqldump -u username -p dbname >filename.sql

例如:mysqldump -u root -p feng_test > d:feng.sql

對某張表備份語法為:mysqldump -u username -p dbname tablename > filename.sql

備份多個數據庫:mysqldump -u username -p --databases booksdb test > filename.sql(備份booksdbtest資料庫)

另外--all-databases引數可以備份系統中所有的資料庫

還原備份:mysql -u  username -p dbname <  filename.sql

如果已經登入了就可以使用:source filaname.sql

2、直接複製資料檔案

3、Mysqlhotcopy快速備份與恢復

該方法是備份資料庫或單個表的最快途徑,但只能備份MYISAM型別的表!

 test資料庫備份到/user/backup目錄下:

Mysqlhotcopy  -u  root -p test /user/backup

恢復資料:

  cp  -r  /usr/backup/test  usr/local/mysql/data

資料庫日誌

MySQL有四類日誌

錯誤日誌:記錄啟動、執行或停止MySQL服務時出現的問題

查詢日誌:記錄建立的客戶端連線和執行的語句

二進位制日誌:記錄所有更改資料的語句,可用於資料複製

慢查詢日誌:記錄執行時間超過long_query_time的所有查詢或不使用索引的查詢。

1、二進位制日誌:

二進位制日誌主要記錄MySQL資料庫的變化。二進位制日誌以一種有效的格式,並且是事務安全的方式包含更新日誌中可用的所有資訊。二進位制日誌包含所有更新了資料或者已經潛在更新了資料的語句。語句以“事件”的形式儲存,描述資料更改。

啟動和設定二進位制日誌

預設情況下,二進位制日誌是關閉的,可以通過修改MySQL的配置檔案來啟動和設定二進位制日誌。My.ini檔案中[mysqld]組下面有如下幾個設定是關於二進位制日誌的:

Log-bin [=path/ [filename] ]

Expire_logs_days = 10

Max_binlog_size = 100M

Log-bin定義開啟二進位制日誌,path表明日誌檔案所在的目錄路徑;filename指定了日誌檔案的名稱。

Expire_logs_days 定義了MySQL清除過期日誌的時間,即二進位制日誌存活的日期

Max_binlog_size :定義了單個檔案的大小,如果二進位制日誌寫入的內容大小超過給定值,日誌就會發生滾動(關閉當前檔案,重新開啟一個新的日誌檔案)

my.ini配置檔案中的[mysqld]組下,新增上述幾個引數與引數值,關閉並重啟MySQL服務程序,即可開啟二進位制日誌。

使用show variables like   ‘log_%’;語句查詢日誌設定

使用show binary logs命令檢視二進位制日誌檔案的個數及檔名

如:show binary logs

使用MySQLbinlog檢視二進位制日誌

如:Mysqlbinlog d:/mysql/log/binlog.000001

2、錯誤日誌

my.ini(或者my.cnf)檔案下的【mysqld】下配置log-error,則可以啟動錯誤日誌。

Show variables like ‘log_error’;

3、通用查詢日誌

通用查詢日誌記錄MySQL所有使用者操作,包括啟動和關閉服務、執行查詢、更新語句等 。通過配置my.ini的【mysqld】組下加入log選項

4、慢查詢日誌

慢查詢日誌是記錄查詢時長超過指定時間的日誌

啟動:a)配置my.ini或者my.cnf中的log-slow-queries選項開啟,

b) MySQL服務啟動時使用-log-slow-queries[=file_name]啟動慢查詢日誌

但都需要在配置檔案中配置 long_query_time選項指定記錄閾值

Show variables like ‘slow_query_log%’;

Set global slow_query_log=1;開啟日誌

Set global long_query_time=4 設定閾值

select *from mysql.slow_log;

MySQL查詢快取

MySQL伺服器有一個重要的特徵是查詢快取,快取機制簡單的說就是快取SQL語句和查詢的結果,如果執行相同的SQL語句,伺服器會直接從快取中取到結果,而不再需要再去解析和執行SQL語句。查詢快取會儲存最新資料,而不會返回過期資料,當資料被修改後,在查詢快取中的的任何相關資料均被清除。

如何使用:

1、設定query_cache_type ON

Set session query_cache_type=on ;

2、檢視查詢快取是否開啟

Select   @@query_cache_type;

3、檢視系統變數have_query_cache是否為YES,該引數表示MYSQL的查詢快取是否可用

Show variables like ‘have_query_cache’;

4、檢視系統變數query_cache_size 的大小,該引數表示資料庫分配給查詢快取的記憶體大小,如果該引數的值設定為0,那麼查詢快取將不起作用。

Select   @@global.query_cache_size;

5、設定系統變數query_cache_size的大小

Set  @@global.query_cache_size = 1000000;

6、如果查詢結果很大導致快取不了,那就得設定query_cache_limit引數的值,

Set  @@global.query_cache_limit = 2000000;

7、以如上方法設定快取大小和快取的最大值只對該次有用,如要永久設定則需修改 my.cnf配置檔案:

[mysqld]

Port = 3306

Query_cache_size  =1000000

Query_cache_limit = 2000000

還有倆條使用的命令:show variables like  ‘%query_cache%’;檢視快取的相關引數

Show status like ‘qcache_hits’;   檢視快取命中的次數

SQL命令還是需要自己多敲多總結才能掌握!

相關推薦

Mysql索引優化

Mysql索引大多是B+樹實現,B+樹是由B樹變化而來,為了描述B-Tree,首先定義一條資料記錄為一個二元組[key, data],key為記錄的鍵值,對於不同資料記錄,key是互不相同的;data為資料記錄除key外的資料。 B樹的每個節點包括key和da

MySQL 索引優化實戰(轉載自蒲葦 CSDN技術頭條)

索引概念和作用索引是一種使記錄有序化的技術,它可以指定按某列/某幾列預先排序,從而大大提高查詢速度(類似於漢語詞典中按照拼音或者筆畫查詢)。索引的主要作用是加快資料查詢速度,提高資料庫的效能。MySQL 索引型別從物理儲存角度上,索引可以分為聚集索引和非聚集索引。1. 聚集索

MySQL索引優化(1)儲存引擎和底層資料結構

在昨天的面試中問到了MySQL索引怎麼優化(查詢很慢怎麼辦),回答的很不理想,所以今天來總結幾篇關於MySQL索引的知識。 1.什麼是索引? 首先我們一定要明確什麼是索引?我自己的總結就是索引是一種資料結構,可以幫助我們快速訪問資料庫的指定資訊,就像一本書的目錄一樣,可以加快查詢速度 2.MySQl儲存引擎

mysql索引的使用優化方法

資料庫高階管理及優化 MySQL效能優化 優化MySQL資料庫是資料庫管理員和資料庫開發人員的必備技能。優化MySQL,一方面是找出系統的瓶頸,提高MySQL資料庫整體的效能;另一方面是合理設計結構和調整引數,以提高使用者操作響應的速度。同時還要儘可能節省系統資源

MySQL索引查詢優化總結

存儲 一行 -1 type 一定的 關鍵技術 表示 智能 string類型 一個簡單的對比測試 前面的案例中,c2c_zwdb.t_file_count表只有一個自增id,FFileName字段未加索引的sql執行情況如下: 在上圖中,type=all,key=nul

MySQL性能優化方法三:索引優化

pan mysql- can 優化 一位 告訴 scan 圖書館 通過 原文鏈接:http://isky000.com/database/mysql-performance-tuning-index 大家都知道索引對於數據訪問的性能有非常關鍵的作用,都知道索引可以提高數據訪

MySQL資料庫】效能優化索引優化(一)

一、Mysql效能優化之影響效能的因素 1.商業需求的影響 不合理的需求造成的資源投入產出,這裡就用一個看上去很簡單的功能分析。需求:一個論壇帖子的總量統計,附加要求:實時更新。從功能上看來是非常容易實現的,執行一條select count(*)from表名就可以得到結果,但是如果我們採

MySQL資料庫索引優化

索引 什麼是索引 索引是用來提高資料庫效能的常用工具,索引就像資料的目錄一樣,通過索引可以快速找到需要的內容。 索引的原理,加快查詢 索引是建立了針對資料內容的排序結果的指標,根據指標快速定位所要的資料。 索引的設計原則 1  索引列一般為where子句中的列或連線列子句中的列。 2&

MySQL 索引慢查詢優化

其他相關文章: MySQL憑藉著出色的效能、低廉的成本、豐富的資源,已經成為絕大多數網際網路公司的首選關係型資料庫。雖然效能出色,但所謂“好馬配好鞍”,如何能夠更好的使用它,已經成為開發工程師的必修課,我們經常會從職位描述上看到諸如“精通MySQL”、“SQL語

MySQL 索引查詢優化總結

本文由雲+社群發表 文章《MySQL查詢分析》講述了使用MySQL慢查詢和explain命令來定位mysql效能瓶頸的方法,定位出效能瓶頸的sql語句後,則需要對低效的sql語句進行優化。本文主要討論MySQL索引原理及常用的sql查詢優化。 一個簡單的對比測試 前面的案例中,c2c_zwdb

MySQL優化索引優化漢字模糊查詢語句

利用MySQL這種關係型資料庫來做索引,的確有些勉強了,也只能看情況來說了,有些簡單的功能還是可以考慮的。 對於模糊查詢語句,最不利的情況是要like '%key%'這樣的查詢,但是如果是like 'key%'這種情況,那麼mysql的索引在些查詢方式上還是可以優化的。 網

MySQL函式索引優化

很多開發人員在使用MySQL時經常會在部分列上進行函式計算等,導致無法走索引,在資料量大的時候,查詢效率低下。針對此種情況本文從MySQL5.7 及MySQL8.0中分別進行不同方式的優化。 1、 MySQL5.7 MySQL5.7版本中不支援函式索引,因此 遇到函式索引的時候需要進行修改,否則即使查詢的欄位

【Spark 深入學習-08】說說Spark分區原理優化方法

學習 格式 讀取文件 tmc 資料 數值計算 詳解 shc 存儲介質 本節內容 ------------------ · Spark為什麽要分區 · Spark分區原則及方法 · Spark分區案例 · 參考

mysql-索引優化

是否 這就是 位置 ica 函數 行為 不支持 size 空值 寫在前面:索引對查詢的速度有著至關重要的影響,理解索引也是進行數據庫性能調優的起點。考慮如下情況,假設數據庫中一個表有10^6條記錄,DBMS的頁面大小為4K,並存儲100條記錄。如果沒有索引,查詢將對整個表進

MySQL性能優化方法一:緩存參數優化

內存大小 提高 算法 mysq 表數據 沒有 級別 data val 原文鏈接:http://isky000.com/database/mysql-perfornamce-tuning-cache-parameter 數據庫屬於 IO 密集型的應用程序,其主要職責就是數據的

MySQL性能優化方法二:表結構優化

嚴格 字符類 datetime 分時 問題: utf 重建表 數據類型 如果 原文鏈接:http://isky000.com/database/mysql-perfornamce-tuning-schema 很多人都將 數據庫設計範式 作為數據庫表結構設計“聖經”,認為只要

MyISAM 存儲引擎的特點優化方法

同一文件 表格 批量插入 圖片 寫入 部分 全文檢索 讀取 相互 MyISAM: MyISAM 管理非事務表、是ISAM 的擴展格式。除了提供ISAM裏所沒有的索引的字段管理等的大量功能、MyISAM 還使用一種表格鎖定的機制、來優化多個並發的讀寫操作。MyISAM

redmine在linux上的mysql性能優化方法與問題排查方案

mon 5.5 rdquo prot 針對 home erl 如何 數據信息 iredmine的linux服務器mysql性能優化方法與問題排查方案 問題定位: 客戶端工具: 1. 瀏覽器inspect-tool的network timing工具

MySQL的一些優化方法

name 避免 mit index 所有 提高 如果 索引 pri 1.Max的優化 如果沒有索引,max需要檢索所有行才能得出結果,這裏可以通過建立索引的方式進行優化: CREATE INDEX idx on products(price); 在products表中對p

MySQL 規範優化

sys nod 直接 gpo 決定 行數 其中 blog 文件 一、建庫建表優化 1、核心規範(推薦) 表字符集選擇UTF8 (“表情”字段單獨設置為其他字符集) 存儲引擎使用INNODB 不在庫中存儲圖片、文件等 使用可變長字符串(v