進行sql優化,解決慢查詢

2021-10-08 14:04:49 字數 3551 閱讀 9380

1、定位慢查詢語句

(1)在篩選系統中慢語句可以執行以下方案:

1,配置開啟

linux:

在mysql配置檔案my.cnf中增加

log-slow-queries=/var/lib/mysql/slowquery.log (指定日誌檔案存放位置,可以為空,系統會給乙個預設的檔案host_name-slow.log)

long_query_time=2 (記錄超過的時間,預設為10s)

log-queries-not-using-indexes (log下來沒有使用索引的query,可以根據情況決定是否開啟)

log-long-format (如果設定了,所有沒有使用索引的查詢也將被記錄)

2、使用explain檢視sql的執行計畫

(1)檢視select_type列避免有

①subquery——在select或where列表中包含了子查詢

② dependent subquery—— 迴圈子查詢,最壞情況

(2)檢視rows列,關注掃瞄的行數

(3)extra列去檢視篩選方式

關注type 列,最好能優化到range級別

select *

from biz_order bo

left join biz_customer bc

on bo.customer_id = bc.id

left join sys_user su1

on su1.phone = bo.create_by

left join sys_institution si

on su1.institution = si.id

left join sys_product sp

on sp.id = bo.product_id

left join biz_make_card bmc

on bmc.order_id = bo.id and bmc.loan_flag !=2

left join biz_make_card bmc2

on bmc2.order_id = bo.id and bmc2.loan_flag =2

left join rel_loan_order_order rloo on bo.id = rloo.order_id

#where 1=1

order by rloo.create_time desc

limit 0,10;

using join buffer(block nested loop) 這個如何優化

1、遇到using filesort 如何解決

1)、該情況一般是不恰當使用order by 所導致的

2) 、需要對orer by的字段新增索引

3)、如果order by 之前還存在where條件,為了防止索引實效需要新增復合索引

4)、如果加上索引仍然不能解決問題,這時需要考慮是不是order by的字段並不是主表上的字段,這樣不僅會導致 using filesort也會導致using temport 拖慢sql的執行速度

5)、如果有乙個order by子句和不同的group by子句,或如果order by或group by包含聯接佇列中的第乙個表之外的其它表的列,則建立乙個臨時表。會引起using temport,所以如果需要同時使用order by 和group by的時候,盡量保證這個兩個欄位是屬於同乙個表,同乙個字段

6)、按加索引的順序進行where篩選

7)、控制字段型別,多使用tinyint 和smallint、字串不要預設為空,可以預設為:" ",數字型別預設為0

8)、全庫統一字符集,否則會因為字符集不一致連表表時產生字符集轉換影響效率 如utf-8 和utf-8mb4,這個是導致using join buffer(block nested loop)的主要原因

9)、靈活使用自連線,但發現自身表語句行不通時,試著嘗試自連線的方式進行篩選

1、如果儲存的字串長度幾乎相等,使用 char 定長字串型別。

2、任何字段如果為非負數,必須是 unsigned 。

3、單錶行數超過 500 萬行或者單錶容量超過 2 gb ,才推薦進行分庫分表。

4、不要用 resultclass 當返回引數,即使所有類屬性名與資料庫字段一一對應,也需

要定義 ; 反過來,每乙個表也必然有乙個與之對應。

##保後資料補充任務表

create table `biz_data_supplement_task` (

`id` int(11) unsigned not null auto_increment,

`order_id` int(11) unsigned default 0 comment '訂單id',

`insurance_no` varchar(32) default '' comment '保單編號',

`task_no` varchar(32) default '' comment '任務編號',

`deal_person` int(11) unsigned default 0 comment '當前處理人',

`monitor_task_status` int(11) unsigned default 0 comment '任務狀態字典code:assets_task_status',

`monitor_task_type` int(11) unsigned default 0 comment '任務型別字典code:assets_task_type',

`task_begin_time` datetime default null comment '任務開始時間',

`task_end_time` datetime default null comment '任務結束時間',

`supplement_data_detail` text default null comment '資料明細',

`node_name` int(11) default 0 comment '流程節點字典code:assets_flow_node',

`create_by` int(11) default 0 comment '建立者',

`create_time` datetime default current_timestamp comment '建立時間',

`update_by` int(11) unsigned default 0 comment '更新者',

`update_time` datetime default current_timestamp on update current_timestamp comment '更新時間',

`del_flag` tinyint unsigned default 0 comment '刪除標識1是0否',

primary key (`id`)

) engine=innodb auto_increment=1 default charset=utf8mb4 comment='保後資料補充任務表';

1、jdbc驅動版本需要改變

2、rank關鍵字需要加rank

3、在url連線中需要加servertimezone=utc這個時區的變化

參考:參考

SQL慢查詢優化

3月19日,3月20日的18 00 20 00之間,db伺服器的cpu load飆公升 dba提出問題原因是sql where rest id and state and id and valid 掃瞄行數太多,執行時間過長 在b端心跳連線時,會傳 queue marker 引數,含義為上次處理的最...

sql查詢慢優化

select g.goods id,g.type id,g.user id,g.productname,g.img,g.intro,g.attr,u.companyname,u.enloginname,u.userid from site goods g force,ucenter member u...

SQL優化(二) 慢查詢

mysql的慢查詢日誌是mysql提供的一種日誌記錄方式,它主要是用來記錄mysql執行語句過程中,響應時間超過閥值的語句,這個閥值可以通過long query time去指定,比如說如果我們將long query time指定為5,則意思執行耗時5秒以上的語句都會被我們的慢查詢日誌給記錄下來.通過...