mysql sql優化教程 SQL優化

2021-10-19 17:05:06 字數 2497 閱讀 8735

在此分享一下我在開發過程中遇到的sql優化問題,希望能對大家有所幫助,不足之處請多多指正。

關於sql優化我們關注的有三個點,分別是1.如何定位待優化的sql,2.如何分析sql的執行效率,3.給出優化方案。

一、對於定位慢sql,我們可以使用慢查詢日誌

1.慢查詢日誌用於記錄執行時間》=設定的執行時間的sql,mysql預設關閉。

2.開啟慢查詢日誌並設定慢查詢時間

通過show variables like '%query%'命令檢視慢查詢日誌的配置。long_query_time表示設定的慢查詢時間,為10秒,表示sql執行時間》=10秒時,該條sql會被記錄到慢查詢日誌檔案;slow_query_log表示慢查詢日誌的開啟狀態,預設為off,表示關閉;slow_query_log_file表示慢查詢日誌的檔案路徑;

通過set global slow_query_log=on;命令,開啟慢查詢日誌,通過set global long_query_time = 1;設定慢查詢時間為1秒,慢查詢日誌檔案的路徑,我們不動配置。執行命令後,我們再次檢視狀態,如下圖所示:

需要注意的是,慢查詢日誌的時間其實已經更改了,需要先退出客戶端,重新連一下伺服器,我們才能看到修改後的值。

二、通過explain命令檢視sql執行效率

#!/usr/bin/python

#!coding=utf-8

import pymysql

import random

import string

import sys

host='127.0.0.1'

port=3306

user='root'

passwd='123456'

db='demo'

sql='insert into user(id, name, ***, age) value (%s, %s, %s, %s)'

insert_count=sys.ar**[1]

conn=pymysql.connect(host, user, passwd, db, port, charset='utf8mb4', cursorclass=pymysql.cursors.dictcursor)

cur = conn.cursor()

cur.execute('delete from user')

for i in range(1, int(insert_count)):

cur.execute(sql, [i, ''.join(random.sample(string.ascii_letters, 6)), random.randint(0, 1), random.randint(1, 160)])

conn.commit()

cur.close()

上述為完整的python腳步,大家可以根據實際情況調整,將其拷貝進檔案,通過python file_name.py 200000, 這條命令執行批量插入的動作,200000表示向資料表寫入199999條資料。(ps: 資料庫名稱demo, 資料表名稱:user, 下圖附user表結構)

2.通過慢查詢日誌定位慢sql

如上圖所示,我們執行了一條sql,其執行時間為1.25秒。我們設定的慢查詢時間為1秒,然後,我們通過cat /var/lib/mysql/xut-slow.log命令,在慢查詢日誌中看到了我們執行的sql。

3.通過explain分析執行效率

如上圖,我們通過explain命令檢視了這條慢sql的執行效率,我們主要關注key這個字段,我們看到這個字段值為null,表示未命中索引。我們看一下user這張表的索引有哪些,如下圖所示,有3個索引。

三、sql優化

通過第二步的explain命令檢視了sql執行效率,我們發現語句未命中索引,所以我們最直接的思路是讓其命中索引,如果查詢欄位未建立索引,我們可以先建立索引,建立索引的語句為alter table table_name add index index_name (欄位名稱); 我們發現name欄位是建立了索引,但是卻沒有走這個索引,這是因為like做模糊查詢時,我們寫法是like '%aaaa%',左邊的萬用字元導致索引未命中,未命中的原因,大家可以自己在網上搜尋一下,我們去掉左邊的萬用字元,就能夠命中索引了,如下圖所示:

如上圖,我們看到,優化後,我們的sql語句命中了索引idx_name,進而其執行效率更高了。

4、總結

以上就sql的優化做了乙個簡單的介紹,這些內容適用於簡單的業務場景,大家可以做個了解。

Mysql sql模糊查詢,sql優化日常

mysql 1 模糊查詢 2 聯表查詢優化 1 模糊查詢 like select from ms fans where nick name like demo limit 0,100 like xx 不能使用索引 like xx 可使用字段索引,查詢效率快 locate同樣不能使用索引,40萬資料中...

mysql sql優化面試題 SQL優化 面試題

因為現在面試經常需要問的需要sql優化,問的具體操作步驟時候的常見做法,所以網上總結這些操作步驟 sql優化的具體操作 1 在表中建立索引,優先考慮where group by使用到的字段。2 盡量避免使用select 返回無用的字段會降低查詢效率。如下 select from t 優化方式 使用具...

MYSQL SQL優化流程

常去想想以前的東西,懷舊不是用感傷的,是溫故知新,加油!1 盡量將複雜的sql拆成幾個簡單的查詢 2 盡量使用表連線,減少使用過 in not in 3 儘量減少子查詢的使用或者將其合併出來 4 盡量將 in not in exists not exists變為 join 語句,減少 合併子查詢 1...