MySQL'de bir veritabanı veya tablo için dizinler nasıl görüntülenir?


486

Veritabanımda herhangi bir dizin olup olmadığını nasıl görebilirim?

Belirli bir tabloya ne dersiniz?


sadece kullan: sp_helpindex 'tablo adı'
— user3772443

"sadece kullanın: sp_helpindex 'tablo adı'" MySQL değil SQL Server (MSSQL) @ user3772443 olarak dikişler
— Raymond Nijland

Yanıtlar:


794

Belirli bir tablonun dizinini görmek için SHOW INDEX kullanın:

SHOW INDEX FROM yourtable;

Belirli bir şemadaki tüm tabloların dizinlerini görmek için BİLGİ_SCHEMA sayfasından STATISTICS tablosunu kullanabilirsiniz:

SELECT DISTINCT
    TABLE_NAME,
    INDEX_NAME
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'your_schema';

Where yan tümcesini kaldırdığınızda, tüm şemalardaki tüm dizinler gösterilir.


10
DISTINCTAnahtar kelime bazı dizinleri maskelemek unutmayın - Ben bir dizin aynı ada sahip ama iki farklı sütun kullanılan bir tablo var, bu yüzden burada bilgi şeması örneği sadece bir dizin gösterecektir.
— Ben

Ben eklemek zorunda from mydbLiorK cevabı gösterildiği gibi.
— Nate

@Mark Byers Dizin tablosunun kendisini görmenin bir yolu var mı? SQL dizin dosyasını dahili olarak nasıl üretir? Dizin tablosundan Ana Tablo'ya bir kaydın işaretçisini nasıl saklar?
— yajant b

Bu yüzden tablom BİLGİ_SCHEMA.STATİSTİK'te görünüyor ancak sadece bir girişi var, index_name. Sütun adını belirten başka bir girdi yoktur. Diğer tüm tablolarda şuna benzer bir şey gösteren birden çok giriş vardır: PRIMARY c1, c2 burada c1, c2, bileşik birincil anahtarı oluşturur. Neden olduğu hakkında bir fikrin var mı?
— Stevers

56

Tüm veritabanlarındaki tüm dizinleri aynı anda görmek istiyorsanız:

use information_schema;
SELECT * FROM statistics;

4
Tek astar olarak:SELECT * FROM information_schema.statistics;
— enharmonik


7

Belirtilen veritabanındaki her tablonun dizin adlarının yanı sıra dizin adlarını almak için bu sorguyu kullanabilirsiniz.

SELECT TABLE_NAME,
       COUNT(1) index_count,
       GROUP_CONCAT(DISTINCT(index_name) SEPARATOR ',\n ') indexes
FROM INFORMATION_SCHEMA.STATISTICS
WHERE TABLE_SCHEMA = 'mydb'
      AND INDEX_NAME != 'primary'
GROUP BY TABLE_NAME
ORDER BY COUNT(1) DESC;

5

Bu sorguyu öneriyorum:

SELECT DISTINCT s.*
FROM INFORMATION_SCHEMA.STATISTICS s
LEFT OUTER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS t 
    ON t.TABLE_SCHEMA = s.TABLE_SCHEMA 
       AND t.TABLE_NAME = s.TABLE_NAME
       AND s.INDEX_NAME = t.CONSTRAINT_NAME 
WHERE 0 = 0
      AND t.CONSTRAINT_NAME IS NULL
      AND s.TABLE_SCHEMA = 'YOUR_SCHEMA_SAMPLE';

Hepiniz Endeksi bulundu sadece indeks.

Saygı.



2

Db üzerindeki tüm devre dışı bırakılmış dizinleri kontrol etmek için

SELECT INDEX_SCHEMA, COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'mydb'
AND COMMENT = 'disabled'

2

Endekslerinizi MySQL çalışma tezgahında kontrol edebilirsiniz. Performans raporları sekmeleri altında sistemde kullanılan tüm indeksleri ve kullanılmayan indeksleri görebilirsiniz. veya sorguyu tetikleyebilirsiniz.

select * from sys.schema_index_statistics;

Paul hangi aracı kullanıyorsunuz? Bu kod mysql workbeanch için çalışıyor.
— Ganesh Giri

MySQL kabuğunda kullandım
— Paul Basenko

Bunu Mysql Workbench kullanarak deneyebilir misiniz? sys.schema_index_statistics'ten * seçin;
— Ganesh Giri

2

Bu benim durumumda dizinlenmiş alanlar için karşılık gelen tabloda tablo adı ve sütun adı almak için çalışır.

SELECT TABLE_NAME , COLUMN_NAME, COMMENT 
FROM information_schema.statistics
WHERE table_schema = 'database_name';
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.