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