mysql locate索引_MYSQL索引优化
1.查看sql的執(zhí)行頻率
MySQL 客戶端連接成功后,通過 show [session|global] status 命令可以提供服務(wù)器狀態(tài)信息。show [session|global] status 可以根據(jù)需要加上參數(shù)“session”或者“global”來顯示 session 級(當前連接)的計結(jié)果和 global 級(自數(shù)據(jù)庫上次啟動至今)的統(tǒng)計結(jié)果。如果不寫,默認使用參數(shù)是“session”。
2.定位效率底下的sql
可以通過以下兩種方式定位執(zhí)行效率較低的 SQL 語句。
慢查詢?nèi)罩?: 通過慢查詢?nèi)罩径ㄎ荒切﹫?zhí)行效率較低的 SQL 語句,用--log-slow-queries[=file_name]選項啟 動時,mysqld 寫一個包含所有執(zhí)行時間超過 long_query_time 秒的 SQL 語句的日志文件。具體可以查看本 書第 26 章中日志管理的相關(guān)部分。
show processlist : 慢查詢?nèi)罩驹诓樵兘Y(jié)束以后才紀錄,所以在應(yīng)用反映執(zhí)行效率出現(xiàn)問題的時候查詢慢查詢 日志并不能定位問題,可以使用show processlist命令查看當前MySQL在進行的線程,包括線程的狀態(tài)、是否 鎖表等,可以實時地查看 SQL 的執(zhí)行情況,同時對一些鎖表操作進行優(yōu)化。
3.explain分析執(zhí)行計劃
?
type 顯示的是訪問類型,是較為重要的一個指標,可取值為:
?
一般來說, 我們需要保證查詢至少達到 range 級別, 最好達到ref 。
Mysql從5.0.37版本開始增加了對 show profiles 和 show profile 語句的支持。show profiles 能夠在做SQL優(yōu)化時 幫助我們了解時間都耗費到哪里去了。
4.索引的使用
如果索引了多列,要遵守最左前綴法則。指的是查詢從索引的最左前列開始,并且不跳過索引中的列。 匹配最左前綴法則,走索引。
不要在索引列上進行運算操作, 索引將失效。
字符串不加單引號,造成索引失效。
盡量使用覆蓋索引(只訪問索引的查詢(索引列完全包含查詢列)),減少select * 。
用or分割開的條件, 如果or前的條件中的列有索引,而后面的列中沒有索引,那么涉及的索引都不會被用到。
以%開頭的Like模糊查詢,索引失效。 如果僅僅是尾部模糊匹配,索引不會失效。如果是頭部模糊匹配,索引失效。通過覆蓋索引可解決。
如果MySQL評估使用索引比全表更慢,則不使用索引。
in 走索引, not in 索引失效。
is NULL , is NOT NULL 有時索引失效。
盡量使用復(fù)合索引,而少使用單列索引 。單列索引數(shù)據(jù)庫會選擇一個最優(yōu)的索引(辨識度最高索引)來使用,并不會使用全部索引 。
5.插入數(shù)據(jù)優(yōu)化
對于 InnoDB 類型的表,有以下幾種方式可以提高導(dǎo)入的效率:
因為InnoDB類型的表是按照主鍵的順序保存的,所以將導(dǎo)入的數(shù)據(jù)按照主鍵的順序排列,可以有效的提高導(dǎo)入數(shù) 據(jù)的效率。如果InnoDB表沒有主鍵,那么系統(tǒng)會自動默認創(chuàng)建一個內(nèi)部列作為主鍵,所以如果可以給表創(chuàng)建一個 主鍵,將可以利用這點,來提高導(dǎo)入數(shù)據(jù)的效率。
在導(dǎo)入數(shù)據(jù)前執(zhí)行 SET UNIQUE_CHECKS=0,關(guān)閉唯一性校驗,在導(dǎo)入結(jié)束后執(zhí)行SET UNIQUE_CHECKS=1,恢 復(fù)唯一性校驗,可以提高導(dǎo)入的效率。
如果應(yīng)用使用自動提交的方式,建議在導(dǎo)入前執(zhí)行 SET AUTOCOMMIT=0,關(guān)閉自動提交,導(dǎo)入結(jié)束后再執(zhí)行 SET AUTOCOMMIT=1,打開自動提交,也可以提高導(dǎo)入的效率。
insert優(yōu)化:
如果需要同時對一張表插入很多行數(shù)據(jù)時,應(yīng)該盡量使用多個值表的insert語句,這種方式將大大的縮減客戶 端與數(shù)據(jù)庫之間的連接、關(guān)閉等消耗。使得效率比分開執(zhí)行的單個insert語句快。
在事務(wù)中進行數(shù)據(jù)插入。
數(shù)據(jù)有序插入。
6.order by語句優(yōu)化:
兩種排序方式
1). 第一種是通過對返回數(shù)據(jù)進行排序,也就是通常說的 filesort 排序,所有不是通過索引直接返回排序結(jié)果的排序 都叫 FileSort 排序。
2). 第二種通過有序索引順序掃描直接返回有序數(shù)據(jù),這種情況即為 using index,不需要額外排序,操作效率高。
了解了MySQL的排序方式,優(yōu)化目標就清晰了:盡量減少額外的排序,通過索引直接返回有序數(shù)據(jù)。where 條件 和Order by 使用相同的索引,并且Order By 的順序和索引順序相同, 并且Order by 的字段都是升序,或者都是 降序。否則肯定需要額外的操作,這樣就會出現(xiàn)FileSort。
如果查詢包含 group by 但是用戶想要避免排序結(jié)果的消耗, 則可以執(zhí)行order by null 禁止排序。
7.優(yōu)化嵌套查詢
Mysql4.1版本之后,開始支持SQL的子查詢。這個技術(shù)可以使用SELECT語句來創(chuàng)建一個單列的查詢結(jié)果,然后把 這個結(jié)果作為過濾條件用在另一個查詢中。使用子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL 操作,同時也可以避免事務(wù)或者表鎖死,并且寫起來也很容易。但是,有些情況下,子查詢是可以被更高效的連接 (JOIN)替代。連接(Join)查詢之所以更有效率一些 ,是因為MySQL不需要在內(nèi)存中創(chuàng)建臨時表來完成這個邏輯上需要兩個步驟的 查詢工作。優(yōu)化OR條件
對于包含OR的查詢子句,如果要利用索引,則OR之間的每個條件列都必須用到索引 , 而且不能使用到復(fù)合索 引; 如果沒有索引,則應(yīng)該考慮增加索引。UNION 語句的 ref 值為 const,OR 語句的 type 值為 null,const 表示是常量值引用,非常快 這兩項的差距就說明了 UNION 要優(yōu)于 OR 。
9.優(yōu)化分頁查詢
一般分頁查詢時,通過創(chuàng)建覆蓋索引能夠比較好地提高性能。在索引上完成排序分頁操作,最后根據(jù)主鍵關(guān)聯(lián)回原表查詢所需要的其他列內(nèi)容。也可以對于主鍵自增的表,可以把Limit 查詢轉(zhuǎn)換成某個位置的查詢 。
總結(jié)
以上是生活随笔為你收集整理的mysql locate索引_MYSQL索引优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Unity 之 发布 Mac 报错 il
- 下一篇: mysql LOCATE函数