国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > MySQL > 正文

mysql的功能優(yōu)化工具

2024-07-24 12:31:57
字體:
供稿:網(wǎng)友
       韓鋒大師分享了一個(gè)mysql的性能優(yōu)化工具,一個(gè)能自動(dòng)采集SQL優(yōu)化相關(guān)各種信息的python腳本,對(duì)于優(yōu)化人員而言,這能省不少事,贊!
       試用了一下,發(fā)現(xiàn)在mysql5.7下,運(yùn)行不起來,細(xì)節(jié)上還是有好幾個(gè)坑的,費(fèi)了一些周折,終于把坑踩完了,現(xiàn)在把細(xì)節(jié)說明一下,并把修改后的SQL分享出來;
       問題1:調(diào)用腳本時(shí),若SQL是用單引號(hào)包含(韓老師就是這么示范的:python mysql_tuning.py -p tuning_sql.ini -s 'select xxx),但這樣會(huì)報(bào)錯(cuò),解決辦法:用雙引號(hào)分隔,如:python mysql_tuning.py -p tuning_sql.ini -s "select * from employees.dept_emp"這樣就沒問題;
 
       問題2:沒有引用string單元,在使用string.atoi時(shí)會(huì)報(bào)錯(cuò),解決辦法:import string;
 
       問題3:mysql5.7后,infomation_schema的幾個(gè)表INFORMATION_SCHEMA.GLOBAL_VARIABLES、INFORMATION_SCHEMA.SESSION_VARIABLES、   INFORMATION_SCHEMA.SESSION_STATUS要替換成performance_schema下的;
 
      問題4:在顯示執(zhí)行計(jì)劃時(shí),table與type也是有可能是NULL的,要做空值處理,另外沒有顯示partitions欄位;
 
      問題5:p_after_status[key]有可能是小數(shù),所以用int去轉(zhuǎn)換會(huì)報(bào)錯(cuò),需要用float;
 
      問題6:db_name顯示成user_pwd了,這個(gè)或者不算問題;
 
   修改后的腳本如下:
點(diǎn)擊(此處)折疊或打開
 
#!/usr/local/bin/python
import datetime
import getopt
import sys
import string
import pprint
from warnings import filterwarnings
import MySQLdb
import ConfigParser
import sqlparse
from sqlparse.sql import IdentifierList, Identifier
from sqlparse.tokens import Keyword, DML
 
filterwarnings('ignore', category = MySQLdb.Warning)
 
seq1="+"
seq2="-"
seq3="|"
 
SYS_PARM_FILTER = (
    'BINLOG_CACHE_SIZE',
    'BULK_INSERT_BUFFER_SIZE',
    'HAVE_PARTITION_ENGINE',
    'HAVE_QUERY_CACHE',
    'INTERACTIVE_TIMEOUT',
    'JOIN_BUFFER_SIZE',
    'KEY_BUFFER_SIZE',
    'KEY_CACHE_AGE_THRESHOLD',
    'KEY_CACHE_BLOCK_SIZE',
    'KEY_CACHE_DIVISION_LIMIT',
    'LARGE_PAGES',
    'LOCKED_IN_MEMORY',
    'LONG_QUERY_TIME',
    'MAX_ALLOWED_PACKET',
    'MAX_BINLOG_CACHE_SIZE',
    'MAX_BINLOG_SIZE',
    'MAX_CONNECT_ERRORS',
    'MAX_CONNECTIONS',
    'MAX_JOIN_SIZE',
    'MAX_LENGTH_FOR_SORT_DATA',
    'MAX_SEEKS_FOR_KEY',
    'MAX_SORT_LENGTH',
    'MAX_TMP_TABLES',
    'MAX_USER_CONNECTIONS',
    'OPTIMIZER_PRUNE_LEVEL',
    'OPTIMIZER_SEARCH_DEPTH',
    'QUERY_CACHE_SIZE',
    'QUERY_CACHE_TYPE',
    'QUERY_PREALLOC_SIZE',
    'RANGE_ALLOC_BLOCK_SIZE',
    'READ_BUFFER_SIZE',
    'READ_RND_BUFFER_SIZE',
    'SORT_BUFFER_SIZE',
    'SQL_MODE',
    'TABLE_CACHE',
    'THREAD_CACHE_SIZE',
    'TMP_TABLE_SIZE',
    'WAIT_TIMEOUT'
 
def f_get_parm(p_dbinfo):
    conn = MySQLdb.connect(host=p_dbinfo[0], user=p_dbinfo[1], passwd=p_dbinfo[2],db=p_dbinfo[3])
    cursor = conn.cursor()
    cursor.execute("select lower(variable_name),variable_value from performance_schema.global_variables where upper(variable_name) in ('"+"','".join(list(SYS_PARM_FILTER))+"') order by variable_name")
    records = cursor.fetchall()
    cursor.close()
    conn.close()
    return records
 
def f_print_parm(p_parm_result):
    print "===== SYSTEM PARAMETER ====="
    status_title=('parameter_name','value')
    print "+--------------------------------+------------------------------------------------------------+"
    print seq3,status_title[0].center(30),
    print seq3,status_title[1].center(58),seq3
    print "+--------------------------------+------------------------------------------------------------+"
 
def f_print_optimizer_switch(p_dbinfo):
    print "===== OPTIMIZER SWITCH ====="
    db = MySQLdb.connect(host=p_dbinfo[0], user=p_dbinfo[1], passwd=p_dbinfo[2],db=p_dbinfo[3])
    cursor = db.cursor()
    cursor.execute("select variable_value from performance_schema.global_variables where upper(variable_name)='OPTIMIZER_SWITCH'")
    rows = cursor.fetchall()
    print "+------------------------------------------+------------+"
    print seq3,'switch_name'.center(40),
    print seq3,'value'.center(10),seq3
    print "+------------------------------------------+------------+"
    for row in rows[0][0].split(','):
        print seq3,row.split('=')[0].ljust(40),
        print seq3,row.split('=')[1].rjust(10),seq3
    print "+------------------------------------------+------------+"
    cursor.close()
    db.close()
    print
 
def f_exec_sql(p_dbinfo,p_sqltext,p_option):
    results={}
    conn = MySQLdb.connect(host=p_dbinfo[0], user=p_dbinfo[1], passwd=p_dbinfo[2],db=p_dbinfo[3])
    cursor = conn.cursor()
 
    if f_find_in_list(p_option,'PROFILING'):
        cursor.execute("set profiling=1")
        cursor.execute("select ifnull(max(query_id),0) from INFORMATION_SCHEMA.PROFILING")
        records = cursor.fetchall()
        query_id=records[0][0] +2 #skip next sql
 
    if f_find_in_list(p_option,'STATUS'):
        #cursor.execute("select concat(upper(left(variable_name,1)),substring(lower(variable_name),2,(length(variable_name)-1))) var_name,variable_value var_value from performance_schema.session_status where variable_name in('"+"','".join(tuple(SES_STATUS_ITEM))+"') order by 1")
        cursor.execute("select concat(upper(left(variable_name,1)),substring(lower(variable_name),2,(length(variable_name)-1))) var_name,variable_value var_value from performance_schema.session_status order by 1")
        records = cursor.fetchall()
        results['BEFORE_STATUS']=dict(records)
  
def f_print_profiling(p_profiling_detail,p_profiling_summary):
    print "===== SQL PROFILING(DETAIL)====="
    status_title=('state','duration','cpu_user','cpu_sys','bk_in','bk_out','msg_s','msg_r','p_f_ma','p_f_mi','swaps')
    print "+--------------------------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+"
    print seq3,status_title[0].center(30),
    print seq3,status_title[1].center(8),
    print seq3,status_title[2].center(8),
    print seq3,status_title[3].center(8),
    print seq3,status_title[4].center(8),
    print seq3,status_title[5].center(8),
    print seq3,status_title[6].center(8),
    print seq3,status_title[7].center(8),
    print seq3,status_title[8].center(8),
    print seq3,status_title[9].center(8),
    print seq3,status_title[10].center(8),seq3
    print "+--------------------------------+----------+----------+----------+----------+----------+----------+----------+----------+----------+----------+"
 
    print "===== SQL PROFILING(SUMMARY)====="

(編輯:武林網(wǎng))

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 上虞市| 扶沟县| 江门市| 鹤庆县| 青岛市| 历史| 江阴市| 湾仔区| 武川县| 西吉县| 孙吴县| 黄山市| 天水市| 沙湾县| 和政县| 长武县| 钦州市| 秭归县| 营山县| 罗田县| 长治市| 南宁市| 突泉县| 响水县| 吉首市| 慈溪市| 达州市| 峨眉山市| 海原县| 湖州市| 安福县| 叶城县| 陵川县| 阿巴嘎旗| 福海县| 金溪县| 赤水市| 金沙县| 汽车| 清徐县| 奈曼旗|