Wie überprüfe ich, ob ein Index für ein Tabellenfeld in MySQL vorhanden ist?

105

Ich musste dies ein paar Mal googeln, daher teile ich meine Fragen und Antworten.

Sean
quelle

Antworten:

139

Verwenden Sie SHOW INDEXwie folgt:

SHOW INDEX FROM [tablename]

Dokumente: https://dev.mysql.com/doc/refman/5.0/en/show-index.html

Sean
quelle
35
SHOW INDEX FROM my_tableWHERE Key_name = 'index_to_check';
Mit
6
Verwenden Sie besser Spaltenname anstelle von Schlüsselname. Auf diese Weise müssen Sie den Indexnamen nicht ermitteln, wenn er automatisch ohne Namen hinzugefügt wird.
Programista
Wie überprüfe ich mehrere Schlüssel?
Berserker
Seien Sie vorsichtig und testen Sie alle Aussagen damit. Dies schlägt bei einigen Tabellen in meiner Datenbank fehl, wenn versucht wird, sie mit LiquiBase 1.9.5 zu verwenden. Möglicherweise ist meine Datenbank beschädigt. Oder vielleicht ist es ein Fehler in der alten Version von LiquiBase, die ich bei der Arbeit nicht mehr benutze.
Steve Gelman
37

Versuchen:

SELECT * FROM information_schema.statistics 
  WHERE table_schema = [DATABASE NAME] 
    AND table_name = [TABLE NAME] AND column_name = [COLUMN NAME]

Hier erfahren Sie, ob in einer bestimmten Spalte ein Index vorhanden ist, ohne dass der Name des Index bekannt sein muss. Es funktioniert auch in einer gespeicherten Prozedur (im Gegensatz zum Index anzeigen).

Stéphan Champagner
quelle
9
SHOW KEYS FROM  tablename WHERE Key_name='unique key name'

Sie können feststellen, ob in der Tabelle ein eindeutiger Schlüssel vorhanden ist

Pulock
quelle
8
show index from table_name where Column_name='column_name';
Somil
quelle
4

Verwenden Sie die folgende Anweisung: SHOW INDEX FROM your_table

Überprüfen Sie dann das Ergebnis für die Felder: Zeile ["Tabelle"], Zeile ["Schlüsselname"]

Stellen Sie sicher, dass Sie "Key_name" richtig schreiben

GK10
quelle
1

um nur ein Tabellenlayout aus der CLI zu betrachten. Du würdest

absteigerisch

oder

show table mytable

JJ
quelle
0

Wenn Sie die Funktionalität benötigen, wenn ein Index für eine Spalte (hier an erster Stelle nacheinander) als Datenbankfunktion vorhanden ist, können Sie diesen Code verwenden / übernehmen. Wenn Sie unabhängig von der Position in einem mehrspaltigen Index prüfen möchten, ob überhaupt ein Index vorhanden ist, löschen Sie einfach den Teil "AND SEQ_IN_INDEX = 1".

DELIMITER $$
CREATE FUNCTION `fct_check_if_index_for_column_exists_at_first_place`(
    `IN_SCHEMA` VARCHAR(255),
    `IN_TABLE` VARCHAR(255),
    `IN_COLUMN` VARCHAR(255)
)
RETURNS tinyint(4)
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Check if index exists at first place in sequence for a given column in a given table in a given schema. Returns -1 if schema does not exist. Returns -2 if table does not exist. Returns -3 if column does not exist. If index exists in first place it returns 1, otherwise 0.'
BEGIN

-- Check if index exists at first place in sequence for a given column in a given table in a given schema. 
-- Returns -1 if schema does not exist. 
-- Returns -2 if table does not exist. 
-- Returns -3 if column does not exist. 
-- If the index exists in first place it returns 1, otherwise 0.
-- Example call: SELECT fct_check_if_index_for_column_exists_at_first_place('schema_name', 'table_name', 'index_name');

-- check if schema exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.SCHEMATA
WHERE 
    SCHEMA_NAME = IN_SCHEMA
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -1;
END IF;


-- check if table exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.TABLES
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -2;
END IF;


-- check if column exists
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    INFORMATION_SCHEMA.COLUMNS
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE
AND COLUMN_NAME = IN_COLUMN
;

IF @COUNT_EXISTS = 0 THEN
    RETURN -3;
END IF;

-- check if index exists at first place in sequence
SELECT 
    COUNT(*) INTO @COUNT_EXISTS
FROM 
    information_schema.statistics 
WHERE 
    TABLE_SCHEMA = IN_SCHEMA
AND TABLE_NAME = IN_TABLE AND COLUMN_NAME = IN_COLUMN
AND SEQ_IN_INDEX = 1;


IF @COUNT_EXISTS > 0 THEN
    RETURN 1;
ELSE
    RETURN 0;
END IF;


END$$
DELIMITER ;
Hubbe73
quelle
-1

Mit der folgenden SQL-Anweisung können Sie überprüfen, ob die angegebene Spalte in der Tabelle indiziert wurde oder nicht

select  a.table_schema, a.table_name, a.column_name, index_name
from    information_schema.columns a
join    information_schema.tables  b on a.table_schema  = b.table_schema and
                                    a.table_name = b.table_name and 
                                    b.table_type = 'BASE TABLE'
left join (
 select     concat(x.name, '/', y.name) full_path_schema, y.name index_name
 FROM   information_schema.INNODB_SYS_TABLES  as x
 JOIN   information_schema.INNODB_SYS_INDEXES as y on x.TABLE_ID = y.TABLE_ID
 WHERE  x.name = 'your_schema'
 and    y.name = 'your_column') d on concat(a.table_schema, '/', a.table_name, '/', a.column_name) = d.full_path_schema
where   a.table_schema = 'your_schema'
and     a.column_name  = 'your_column'
order by a.table_schema, a.table_name;

Da die Verknüpfungen gegen INNODB_SYS_ * gerichtet sind, stammen die Übereinstimmungsindizes nur aus INNODB-Tabellen

Dian Yudha Negara
quelle
-1

Versuchen Sie Folgendes:

SELECT TRUE
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_SCHEMA = "{DB_NAME}" 
AND TABLE_NAME = "{DB_TABLE}"
AND COLUMN_NAME = "{DB_INDEXED_FIELD}";
De Paradox
quelle
-3

Sie können keine bestimmte Show-Index-Abfrage ausführen, da sie einen Fehler auslöst, wenn kein Index vorhanden ist. Daher müssen Sie alle Indizes in ein Array packen und sie durchlaufen, wenn Sie SQL-Fehler vermeiden möchten.

Hier ist, wie ich es mache. Ich nehme alle Indizes aus der Tabelle (in diesem Fall leads) und überprüfe dann in einer foreach-Schleife, ob der Spaltenname (in diesem Fall province) vorhanden ist oder nicht.

$this->name = 'province';

$stm = $this->db->prepare('show index from `leads`');
$stm->execute();
$res = $stm->fetchAll();
$index_exists = false;

foreach ($res as $r) {
    if ($r['Column_name'] == $this->name) {
        $index_exists = true;
    }
}

Auf diese Weise können Sie die Indexattribute wirklich eingrenzen. Machen Sie eine print_rvon, $resum zu sehen, mit was Sie arbeiten können.

kjdion84
quelle