desc test1; +-------+----------+------+-----+---------+-------+ | Field | Type | Null | Key | De..."/>
溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SQL語(yǔ)句優(yōu)化

發(fā)布時(shí)間:2020-07-09 03:11:00 來(lái)源:網(wǎng)絡(luò) 閱讀:786 作者:IT_外賣小哥 欄目:MySQL數(shù)據(jù)庫(kù)

一、SQL語(yǔ)句優(yōu)化

(1)查看表結(jié)構(gòu)
MariaDB [oldboy]> desc test1;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(4)   | NO   |     | NULL    |       |
| name  | char(16) | NO   |     | NULL    |       |
| age   | int(2)   | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
(2)explain 查看是否含有建立索引的語(yǔ)句
MariaDB [oldboy]> explain select * from test1 where name="kaka"\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
         type: ALL
possible_keys: NULL
          key: NULL
      key_len: NULL
          ref: NULL
         rows: 5   #查詢行數(shù),表示當(dāng)前查詢了5行
        Extra: Using where
1 row in set (0.00 sec)
(3)創(chuàng)建索引
MariaDB [oldboy]> create index index_name on test1(name);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0
(4)重新查詢
MariaDB [oldboy]> explain select * from test1 where name="kaka"\G
*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: test1
         type: ref
possible_keys: index_name
          key: index_name
      key_len: 48
          ref: const
         rows: 1   #查詢行數(shù),表示當(dāng)前只查詢了1行
        Extra: Using index condition
1 row in set (0.00 sec)

#從以上例子可以看到,使用索引,可以更快的查詢所需要的信息。

二、使用explain命令優(yōu)化SQL語(yǔ)句(select語(yǔ)句)的基本流程

1、抓慢查詢SQL語(yǔ)法方法

每隔2,秒輸入:SHOW FULL PROCESSLIST; 如果出現(xiàn)2次說明存在慢查詢
MariaDB [oldboy]> show full processlist;
+----+------+-----------+--------+---------+------+-------+-----------------------+----------+
| Id | User | Host      | db     | Command | Time | State | Info                  | Progress |
+----+------+-----------+--------+---------+------+-------+-----------------------+----------+
|  9 | root | localhost | oldboy | Query   |    0 | NULL  | show full processlist |    0.000 |
+----+------+-----------+--------+---------+------+-------+-----------------------+----------+
1 row in set (0.00 sec)

2、分析慢查詢?nèi)罩?/h3>
配置參數(shù)記錄慢查詢語(yǔ)句
log_query_time = 2     #執(zhí)行超過2s記錄到log中
log_queries_not_using_indexes    #沒有走索引的語(yǔ)句,記錄log中
log-slow-queries = /data/3306/slow.log    #log的位置

explain select * from test from where name='oldboy'\G  #查看是否走索引
explain select SQL_NO_CACHE * from test where name='oldboy'\G #去除緩存

3、對(duì)需要建索引的條件列建立索引

生產(chǎn)場(chǎng)景,大表不能高峰期建立索引,例如:300萬(wàn)記錄

4、分析慢查詢SQL的工具mysqlsla(每天早晨發(fā)郵件)

切割慢查詢?nèi)罩?,去重分析后發(fā)給大家
1)mv,reload進(jìn)程 2)cp,>清空
2)定時(shí)任務(wù)
mv /data/3306/slow.log /opt/$(date +%F)_slow.log
mysqladmin -uroot -p123456 flush-logs 

mysqlsla分析:http://blog.itpub.net/7607759/viewspace-692828/

優(yōu)化起因:
1)網(wǎng)站出了問題,訪問很慢。
    a.web服務(wù)器的負(fù)載、存儲(chǔ)、db(負(fù)載、io、cpu)
    登錄db:show full processlist
2)慢查詢語(yǔ)句(日志文件)
long_query_time=2    #執(zhí)行超過2s記錄到log中
log_queries_not_using_indexs  #沒有走索引的語(yǔ)句,記錄log中
log-slow-queries=/data/3306/slow.log   #log的位置
切割,分析,發(fā)給管理員

案例分析:
1.查看是否db存在慢查詢:show full processlist;
2.explain分析:explain 慢查詢的語(yǔ)句
3.查看表結(jié)構(gòu):desc test1;
4.定位在哪列建立索引,哪張表
5.查看條件字段列的唯一值的數(shù)量  select count(distinct ader) from ad_oldboy_detail
6.建立索引  create index ....

三、使用profile優(yōu)化SQL語(yǔ)句優(yōu)化

了解內(nèi)容,高級(jí)DBA使用
help show profile;
select @@profiling;
set profiling = 1;
select @@profiling;
show profile;
show profile for query 2;

http://www.cnblogs.com/adforce/archive/2012/06/02/2532287.html
向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI