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.