MySQL检查冗余索引代码

接手了个新需求检查公司所有库表冗余索引,保存下代码复用。

#!/usr/bin/python2.7

# -*- coding: utf-8 -*-

#[email protected]

import MySQLdb

import sys

import os

import time,datetime

import logging

import mysqlcommon

path = sys.path[0]

fpath = os.path.dirname(path) + "/"

sys.path.append(fpath)

from instance import base

from lib import mysqllib

from lib import maillib

from lib import configgetter

getter = configgetter.Configuration("conf/global.cnf")

luser = getter.get("mysqlha", "user")

lpasswd = getter.get("mysqlha", "passwd")

email_addr = ‘[email protected]‘

def MySQL_conn(host,port,db,sql):

db = MySQLdb.connect(host=host, port=port, user=luser, passwd=lpasswd, db=db)

cursor = db.cursor()

cursor.execute(sql)

result = cursor.fetchall()

return result

def get_MySQL(host,port,db,tname):

#最长的索引数,也就是循环的次数

sql = "select max(SEQ_IN_INDEX) from information_schema.STATISTICS where table_schema=‘%s‘ \

and table_name=‘%s‘;" % (db,tname)

num = MySQL_conn(host,port,db,sql)

num = num[0][0]

index_na_all=[]

status = []

if num != None:

for numb in range(num):

a = numb+1

b = numb +2

#查询第一个位置重复的字段名

if a == 1:

sql1 = "select COLUMN_NAME  from information_schema.STATISTICS where  table_schema=‘%s‘ and table_name=‘%s‘ \

and SEQ_IN_INDEX = %s and INDEX_NAME != ‘PRIMARY‘ group by COLUMN_NAME having count(*) >1;" % (db,tname,a)

else:

sql1 = "select COLUMN_NAME  from information_schema.STATISTICS where  table_schema=‘%s‘ and table_name=‘%s‘ \

and SEQ_IN_INDEX = %s and INDEX_NAME in (%s)  group by COLUMN_NAME having count(*) >1;" % (db,tname,a,idx_tw1)

data = MySQL_conn(host,port,db,sql1)

if data == ():

break

alist = []

for data1 in data:

alist.append(data1[0])

colu = ‘\‘,\‘‘.join(alist)

colu = "\‘" + colu + "\‘"

#查询第一个位置相同的索引名

if a == 1:

sql2 = "select INDEX_NAME  from information_schema.STATISTICS where  table_schema=‘%s‘ and table_name=‘%s‘ \

and SEQ_IN_INDEX = %s and COLUMN_NAME in (%s);" % (db,tname,a,colu)

else:

sql2 = "select INDEX_NAME  from information_schema.STATISTICS where  table_schema=‘%s‘ and table_name=‘%s‘ \

and SEQ_IN_INDEX = %s and COLUMN_NAME in (%s) and INDEX_NAME IN (%s) ;" % (db,tname,a,colu,idx_tw1)

in_name = []

index_name = MySQL_conn(host,port,db,sql2)

index_na = [i[0] for i in index_name]

if index_na == []:

continue

for iname in index_na:

in_name.append(iname)

inname = ‘\‘,\‘‘.join(in_name)

inname = "\‘" + inname + "\‘"

#第一个位置相同而且有第二个位置的索引名

sql4 = "select INDEX_NAME  from information_schema.STATISTICS where  table_schema=‘%s‘ and table_name=‘%s‘  \

and INDEX_NAME in (%s)  and SEQ_IN_INDEX=%s;" % (db,tname,inname,b)

idx_two = MySQL_conn(host,port,db,sql4)

idx_tw = [i[0] for i in idx_two]

idx_tw1 = ‘\‘,\‘‘.join(idx_tw)

idx_tw1 = "\‘" + idx_tw1 + "\‘"

for idna in idx_tw:

if idna in index_na:

index_na.remove(idna)

if index_na != []:

index_na_all.append(index_na)

if index_na_all != []:

produc = base.getProductByPort(port)

prod = produc[‘result‘].values()

if prod:

produc = prod[0]

else:

produc = ‘‘

if index_na_all[0] != []:

status.append([port,produc,db,tname,index_na_all[0]])

return status[0]

else :

return 123

else :

return 123

def call_MySQL():

db = ‘backup‘

host = ‘10.20.6.5‘

port = 3440

sql = "select  host,port from policy  ;"

allph = MySQL_conn(host,port,db,sql)

showdb = ‘mysql‘

showsql = "show databases;"

system_lib = ((‘information_schema‘,), (‘mondmm‘,), (‘mysql‘,), (‘performance_schema‘,))

statu = []

for i in allph:

port = i[1]

host = i[0]

dbname = MySQL_conn(host,port,showdb,showsql)

rdbname = set(dbname) - set(system_lib)

for rname in rdbname:

namesql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = ‘%s‘;" % rname

rtable_name = MySQL_conn(host,port,rname[0],namesql)

for table_name in rtable_name:

result = get_MySQL(host,int(port),rname[0],table_name[0])

if result != 123:

statu.append(result)

SendMail(statu)

def SendMail(statu):

title = ‘report(数据库冗余索引报表_%s)‘ % (datetime.datetime.now().strftime(‘%Y-%m-%d‘))

col_name = [‘端口‘,‘产品线‘,‘库名‘,‘表名‘,‘索引名‘]

maillib.sendHtml(email_addr,title,statu,col_name)

call_MySQL()

时间: 2024-08-27 15:46:42

MySQL检查冗余索引代码的相关文章

mysql重复索引、冗余索引、未使用索引的定义和查找

1.冗余和重复索引 mysql允许在相同列上创建多个索引,无论是有意还是无意,mysql需要单独维护重复的索引,并且优化器在优化查询的时候也需要逐个地进行考虑,这会影响性能.重复索引是指的在相同的列上按照相同的顺序创建的相同类型的索引,应该避免这样创建重复所以,发现以后也应该立即删除.但,在相同的列上创建不同类型的索引来满足不同的查询需求是可以的. 冗余索引和重复索引有一些不同,如果创建了索引(a,b),再创建索引(a)就是冗余索引,因为这只是前面一个索引的前缀索引,因此(a,b)也可以当作(a

MySQL索引的维护与优化——查找重复及冗余索引

方法一:通过MySQL的information_schema数据库 查找重复与冗余索引 SELECT a.table_schema AS '数据库', a.table_name AS '表名', a.index_name AS '索引1', b.index_name AS '索引2', a.column_name AS '重复列名' FROM information_schema.statistics a JOIN statistics b ON a.table_schema = b.table

MySQL 创建唯一索引忽略对已经重复数据的检查

MySQL 创建唯一索引忽略对已经重复数据的检查 在创建唯一索引的基础上加上关键字"IGNORE "即可. # 重复数据 mysql> select aid,count(aid) as total ,email,tel_no,account_type,exten,passwd from fudao_admin group by user_name having total> 1; +-------+-------+--------------------------+---

数据库 MySQL进阶之索引

数据库的索引非常重要,基本面试数据库的问题都在索引上,所以这里小编整理出来,一方面为了自己复习,一方面也方便大家. 一,索引前传 在了解数据库索引之前,首先有必要了解一下数据库索引的数据结构基础,那么什么样的数据结构可以作为索引呢? B-tree是最常用的用于索引的数据结构.因为它们是时间复杂度低, 查找.删除.插入操作都可以可以在对数时间内完成.另外一个重要原因存储在B-Tree中的数据是有序的.数据库管理系统(RDBMS)通常决定索引应该用哪些数据结构.但是,在某些情况下,你在创建索引时可以

mysql之高性能索引

mysql之高性能索引 当db的量达到一定数量级之后,每次进行全表扫描效率就会很低,因此一个常见的方案是建立一些必要的索引作为优化手段,那么问题就来了: 那么什么是索引呢? 索引的实现原理是怎样的? 我们通常说的聚集索引,非聚集索引的区别是什么? 如何创建和使用索引呢? I. 索引介绍 MySQL官方对索引的定义为:索引是帮助MySQL高效获取数据的数据结构.简而言之,索引是数据结构 1. 几种树的结构 a. B+树 单来说就是一种为磁盘或者其他存储设备而设计的一种平衡二叉树,在B+tree中所

mysql中的索引原理与表设计

索引是有效使用数据库的基础,但你的数据量很小的时候,或许通过扫描整表来存取数据的性能还能接受,但当数据量极大时,当访问量极大时,就一定需要通过索引的辅助才能有效地存取数据.一般索引建立的好坏是性能好坏的成功关键. 1.InnoDb数据与索引存储细节 使用InnoDb作为数据引擎的Mysql和有聚集索引的SqlServer的数据存储结构有点类似,虽然在物理层面,他们都存储在Page上,但在逻辑上面,我们可以把数据分为三块:数据区域,索引区域,主键区域,他们通过主键的值作为关联,配合工作.默认配置下

Mysql5.7—mysql性能优化-索引、语句、配置(运维必备)

小生博客:http://xsboke.blog.51cto.com 小生 Q Q:1770058260 -------谢谢您的参考,如有疑问,欢迎交流 一. 数据库的类型 1) 第一代数据库: 基于层次模型与网状模型的数据库 层次型数据库比较经典的是IBM公司的IMS(InformationManagement System)数据库,层次型数据库提供了良好的完整性支持,模型简单,对具有一对多层关系的部们描述非常自然.直观,容易理解,比较适用于那些实体间联系是固定的且预先定义好的环境,其性能优于关

论MySQL何时使用索引,何时不使用索引

索引: 使用索引可快速访问数据库表中的特定信息.索引是对数据库表中一列或多列的值进行排序的一种结构,例如 employee 表的姓(name)列.如果要按姓查找特定职员,与必须搜索表中的所有行相比,索引会帮助您更快地获得该信息. 索引是一个单独的.物理的数据库结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单. 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序.数据库使用索引的方式与您使用书籍中的索引的方式很相似:它搜索

mysql 强制走索引

查询是数据库技术中最常用的操作.查询操作的过程比较简单,首先从客户端发出查询的SQL语句,数据库服务端在接收到由客户端发来的SQL语句后, 执行这条SQL语句,然后将查询到的结果返回给客户端.虽然过程很简单,但不同的查询方式和数据库设置,对查询的性能将会有很在的影响. 因此,本文就在MySQL中常用的查询优化技术进行讨论.讨论的内容如:通过查询缓冲提高查询速度:MySQL对查询的自动优化:基于索引的排序:不可达查询的检测和使用各种查询选择来提高性能. 一. 通过查询缓冲提高查询速度 一般我们使用