Man page for mk-duplicate-key-checker

August 24, 2007 – 5:35 pm

MK-DUPLICATE-KEY-CHECKER


Section: User Contributed Perl Documentation (1)
Updated: 2008-06-01
Index
Return to Main Contents

 

NAME

mk-duplicate-key-checker – Find possible duplicate indexes and foreign keys on
MySQL tables.
 

DESCRIPTION


This program examines the output of SHOW CREATE TABLE on MySQL tables, and if
it finds indexes that cover the same columns as another index in the same
order, or cover an exact leftmost prefix of another index, it prints out
the suspicious indexes. By default, indexes must be of the same type, so a
BTREE index is not a duplicate of a FULLTEXT index, even if they have the same
colums. You can override this.

It also looks for duplicate foreign keys. A duplicate foreign key covers the
same columns as another in the same table, and references the same parent
table.
 

DOWNLOADING


You can download Maatkit from the Sourceforge website at
<http://sourceforge.net/projects/maatkit>, or you can get any of the tools
easily with a command like the following:


wget http://www.maatkit.org/get/toolname
or
wget http://www.maatkit.org/trunk/toolname

Where "toolname" can be replaced with the name (or fragment of a name) of any
of the Maatkit tools. Once downloaded, they’re ready to run; no installation is
needed. The first URL gets the latest released version of the tool, and the
second gets the latest trunk code from Subversion.
 

OPTIONS



–allatonce


Prints everything it finds in one chunk. The default is to print a database at
a time.
–allstruct


Compare indexes with different structures. By default this is disabled, because
a BTREE index that covers the same columns as a FULLTEXT index is not really a
duplicate, for example.
–askpass


Prompt for a password when connecting to MySQL.
–charset


Enables character set settings in Perl and MySQL. If the value is "utf8", sets
Perl’s binmode on STDOUT to utf8, passes the "mysql_enable_utf8" option to
DBD::mysql, and runs "SET NAMES UTF8" after connecting to MySQL. Any other
value sets binmode on STDOUT without the utf8 layer, and runs "SET NAMES" after
connecting to MySQL.
–clustered


Detects when a suffix of a secondary key is a leftmost prefix of the primary
key, and treats it as a duplicate key. Only detects this condition on storage
engines whose primary keys are clustered (currently InnoDB and solidDB).

Clustered storage engines append the primary key columns to the leaf nodes of
all secondary keys anyway, so you might consider it redundant to have them
appear in the internal nodes as well. Of course, you may also want them in the
internal nodes, because just having them at the leaf nodes won’t help for some
queries. It does help for covering index queries, however.

Here’s an example of a key that is considered redundant with this option:


PRIMARY KEY (`a`)
KEY `b` (`b`,`a`)

–databases


A comma-separated list of databases to examine.
–defaults-file


Only read default options from the given file.
–engine


Do only tables whose storage engine is in this comma-separated list.
–function


What to check: ‘f’ is foreign keys, ‘k’ is indexes. The default is to check
both.
–help


Displays a help message.
–host


Connect to host.
–ignoredb


A comma-separated list of databases to ignore.
–ignoreengine


Use this option to skip a comma-separated list of storage engines (table types).
–ignoreorder


Ignore column ordering, so an index on columns (a,b) is considered a duplicate
of an index on columns (b,a).
–ignoretbl


A comma-separated list of tables to ignore. Table names may be qualified with
the database name.
–password


Password to use when connecting.
–port


Port number to use for connection.
–setvars


Specify any variables you want to be set immediately after connecting to MySQL.
These will be included in a "SET" command.
–socket


Socket file to use for connection.
–tab


Print output separated with tabs, instead of whitespace-aligned. See
OUTPUT” for details.
–tables


A comma-separated list of tables to check. Table names may be qualified with
the database name.
–user


User for login if not current user.
–verbose


Output all keys and/or foreign keys found, not just redundant ones.
–version


Output version information and exit.

 

OUTPUT


Output is to STDOUT, one line per server and table, with header lines for each
database. I tried to make the output easy to process with awk. For this reason
columns are always present. If there’s no value, the script prints ‘NULL‘.
Output is sorted by database and table.

The columns in the output are as follows.


DATABASE


The database the table is in.
TABLE


The table name.
ENGINE


The table’s storage engine.
OBJECT


The index or constraint’s name, e.g. `tbl_ibfk_3` (the default InnoDB name for
the third foreign key on a table named tbl).
TYPE


KEY‘ for indexes, ‘FK‘ for foreign keys.
STRUCT


The type of index: BTREE, FULLTEXT, HASH etc. By default MySQL’s indexes are
BTREE in most cases. This does not apply to foreign keys.
PARENT


The parent table to which the foreign key constraint refers. This does not
apply to indexes.
COLUMNS


The columns included in the index or foreign key constraint. For indexes,
this column list is output verbatim, as shown in SHOW CREATE TABLE. For
foreign keys, the columns are ordered so string comparison can find
duplicates, since column order in a foreign key is immaterial.

 

ENVIRONMENT


The environment variable "MKDEBUG" enables verbose debugging output in all of
the Maatkit tools:


MKDEBUG=1 mk-….

 

SYSTEM REQUIREMENTS


You need the following Perl modules: DBI and DBD::mysql.
 

BUGS


Please use the Sourceforge bug tracker, forums, and mailing lists to request
support or report bugs: <http://sourceforge.net/projects/maatkit/>.

Please include the complete command-line used to reproduce the problem you are
seeing, the version of all MySQL servers involved, the complete output of the
tool when run with “–version”, and if possible, debugging output produced by
running with the "MKDEBUG=1" environment variable.
 

LICENSE


This program is copyright (c) 2007 Baron Schwartz.
Feedback and improvements are welcome.

THIS PROGRAM IS PROVIDEDAS ISAND WITHOUT ANY EXPRESS OR IMPLIED
WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF
MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation, version 2; OR the Perl Artistic License. On UNIX and similar
systems, you can issue `man perlgpl’ or `man perlartistic’ to read these
licenses.

You should have received a copy of the GNU General Public License along with
this program; if not, write to the Free Software Foundation, Inc., 59 Temple
Place, Suite 330, Boston, MA 02111-1307 USA.
 

AUTHOR


Baron Schwartz.
 

VERSION


This manual page documents Ver 1.1.6 Distrib 1972 $Revision: 1970 $.



 

Index



NAME

DESCRIPTION

DOWNLOADING

OPTIONS

OUTPUT

ENVIRONMENT

SYSTEM REQUIREMENTS

BUGS

LICENSE

AUTHOR

VERSION



Related posts:

  1. man mysqlshow – Man page for mysqlshow
  2. man drop_table – Man page for drop_table
  3. man mysqlimport – Man page for mysqlimport
  4. Man page for mk-deadlock-logger
  5. man Pod::Checker – Man page for Pod::Checker
  6. man mysqlhotcopy – Man page for mysqlhotcopy
  7. man mysql_fix_privilege_tables – Man page for mysql_fix_privilege_tables
  8. man myisam_ftdump – Man page for myisam_ftdump
  9. man mysql_upgrade – Man page for mysql_upgrade
  10. Man page for mk-table-sync

Post a Comment