Kullanılmayan / gereksiz index'i bul, invisible yap, güvenle sil
MySQLIndex & İstatistikKomut
-- Aday 1: restart'tan beri hic kullanilmamis index'ler
SELECT * FROM sys.schema_unused_indexes WHERE object_schema = 'shop';
-- Aday 2: baska bir index'in sol on eki olan (redundant) index'ler
SELECT table_name, redundant_index_name, redundant_index_columns, dominant_index_name, sql_drop_index
FROM sys.schema_redundant_indexes WHERE table_schema = 'shop';
-- Silmeden once gorunmez yap; sorun cikarsa aninda geri al
ALTER TABLE shop.big ALTER INDEX ix_region INVISIBLE;
SELECT INDEX_NAME, IS_VISIBLE FROM information_schema.STATISTICS WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'big' AND SEQ_IN_INDEX = 1;
-- Tek sorguda gorunmez index'i dene
EXPLAIN SELECT /*+ SET_VAR(optimizer_switch = 'use_invisible_indexes=on') */ COUNT(*) FROM shop.big WHERE region = 'TR';
ALTER TABLE shop.big ALTER INDEX ix_region VISIBLE;
-- Birkac is dongusu (ay sonu dahil) sorunsuz gecerse
ALTER TABLE shop.big DROP INDEX ix_region, ALGORITHM=INPLACE, LOCK=NONE;Ne yapar?
Kullanılmayan ve başka bir index tarafından kapsanan index'leri listeler; silmeden önce index'i invisible yaparak optimizer'ın onu kullanmadığı durumu canlıda test etmeye ve gerekirse anında (yeniden build etmeden) geri almaya izin verir.
Ne zaman kullanılır?
Yazma maliyetini, buffer pool baskısını ve disk kullanımını azaltmak için index temizliği yaparken.
Dikkat
schema_unused_indexes yalnız son restart'tan bu yana toplanan istatistiğe dayanır; aylık rapor gibi seyrek sorgular görünmeyebilir. Replikalarda farklı sorgu yükü varsa her sunucuda ayrı kontrol et. Invisible index DML'de güncellenmeye devam eder (yazma maliyeti sürer) ama optimizer kullanmaz; unique index invisible olsa da unique constraint'i uygulanır. PRIMARY KEY invisible yapılamaz. Index'i FORCE INDEX / USE INDEX ile adıyla kullanan sorgular, index invisible olunca hata verir.