mysql重建索引


點擊查看代碼
# -*- coding: utf-8 -*-

"""

測試數據庫
create database test charset=utf8;
use test;

測試數據表
drop table tbl_name;
create table tbl_name(
  id int auto_increment comment "主鍵",
  username varchar(20) not null comment "賬號",
  sex tinyint default 0 comment "性別",
  age tinyint default 1 comment "年齡",
  nickname varchar(20) not null default "游客" comment "昵稱",
  PRIMARY KEY `id_000` (`id`),
  UNIQUE KEY `username_100` (`username`),
  index `nickname_2000` (`nickname`),
  UNIQUE KEY index_name_sex (`username`, `sex` ),
  index `index_sex_age` (`sex`,`age`)
);

# 添加測試數據
insert into tbl_name (username,sex,age,nickname) 
values ("xiaoming",1,16,"小明"),("xiaobai",0,16,"小白"),("xiaohui",1,16,"小輝");

# 查看索引
SHOW INDEX FROM tbl_name;

# 基本使用:
# 1. 在腳本頭部配置,mysql的基本參數[登錄賬號, 登錄密碼, 數據庫名]
# 2. 在終端執行當前腳本,以表名作為腳本參數進行啟動
  python 腳本.py 表名
  
# 注意事項
  腳本實現了普通索引,唯一索引和多列索引的重建工作,針對全文索引和主鍵沒有實現
"""

import subprocess, argparse,re
class MySQL(object):
    def __init__(self,tbname=None):
        self.tbname = tbname
        self.username = "root"  # 登錄賬號
        self.password = "123"  # 登錄密碼
        self.database = "test"  # 數據庫名
        self.handle  = None
        self.result = None
        self.connection()
        self.query_index(self.get_index)

    def connection(self):
        cmd = ['mysql', '-u%s' % self.username, '-p%s' % self.password]
        self.handle = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, universal_newlines=True)

    def query_index(self,callback):
        """查詢當前表中的索引信息"""
        if len(self.tbname) < 1:
            return
        sql = "SHOW INDEX FROM %s.%s;" % (self.database,self.tbname)
        self.handle.stdin.write(sql)
        self.result = self.handle.communicate()[0]
        index_list = callback()
        print(index_list)
        self.drop_index(index_list)
        self.create_index(index_list)

    def drop_index(self,index_list):
        """刪除索引"""
        for index_name in index_list:
            drop_index_sql = "ALTER TABLE %s.%s DROP INDEX %s" % (self.database,self.tbname,index_name)
            self.connection()
            self.query(drop_index_sql)

    def create_index(self,index_list):
        """創建索引"""
        for index_name,index_info in index_list.items():
            """判斷是唯一索引還是普通索引"""
            index_type = "UNIQUE KEY" if index_info[0]["non_unique"] == '0' else "INDEX"
            sql = "ALTER TABLE %s.%s ADD %s `%s` (" % (self.database,self.tbname, index_type,index_name)

            if len(index_info) == 1:
                """單列索引"""
                sql += "`%s` " % index_info[0]["column_name"]
            else:
                """多列索引"""
                sql += ",".join( ["`%s`" % item["column_name"] for item in index_info] )
            sql += ");"

            self.connection()
            self.query(sql)

    def query(self,sql):
        self.handle.stdin.write(sql)
        self.result = self.handle.communicate()[0]

    def get_index(self):
        """獲取索引信息"""
        data = self.result.strip("\n")
        data = data.split("\n")
        index_list = {}
        for key,row in enumerate(data[1:]):
            ret = re.match("\S*\t(?P<non_unique>\S*)\t(?P<index_name>\S*)\t(?P<seq_in_index>\S*)\t(?P<column_name>\S*)\t\S*",row,re.S)
            if ret.groups()[1] == "PRIMARY":
                continue
            info = ret.groupdict()
            index_name = info["index_name"]
            del info["index_name"]
            if index_name in index_list:
                index_list[index_name].append(info)
            else:
                index_list[index_name] = [info]

        return index_list
if __name__ == '__main__':
    
    parser = argparse.ArgumentParser()
    parser.add_argument('table', default='',type=str)
    args = parser.parse_args()
    MySQL(args.table)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM