ALTER TABLOSUNU hızlandırmanın kesin bir yolu, gereksiz dizinleri kaldırmaktır
İşte tablonun yeni bir sürümünü yüklemek için ilk adımlar
CREATE TABLE s_relations_new LIKE s_relations;
#
# Drop Duplicate Indexes
#
ALTER TABLE s_relations_new
DROP INDEX source_persona_index,
DROP INDEX target_persona_index,
DROP INDEX target_persona_relation_type_index
;
Lütfen aşağıdakilere dikkat edin:
Source_persona_index'i diğer 4 dizindeki ilk sütun olduğu için bıraktım
- unique_target_persona
- unique_target_object
- source_and_target_object_index
- source_target_persona_index
Diğer 2 dizindeki ilk sütun olduğu için target_persona_index'i bıraktım
- target_persona_relation_type_index
- target_persona_relation_type_message_id_index
İlk 2 sütun da target_persona_relation_type_message_id_index içinde olduğundan target_persona_relation_type_index'i bıraktım
Tamam Bu gereksiz dizinlerle ilgilenir. Düşük kardinaliteye sahip indeksler var mı? İşte bunu belirlemenin yolu:
Aşağıdaki sorguları çalıştırın:
SELECT COUNT(DISTINCT sent_at) FROM s_relations;
SELECT COUNT(DISTINCT message_id) FROM s_relations;
SELECT COUNT(DISTINCT target_object_id) FROM s_relations;
Sorunuza göre, yaklaşık 80.000.000 satır var. Genel bir kural olarak, seçilen sütunların esas değeri tablo satır sayısının% 5'inden büyükse MySQL Query Optimizer bir dizin kullanmaz. Bu durumda, bu 4.000.000 olurdu.
- Eğer
COUNT(DISTINCT sent_at)
> 4.000.000
- sonra
ALTER TABLE s_relations_new
DROP INDEX sent_at_index;
- Eğer
COUNT(DISTINCT message_id)
> 4.000.000
- sonra
ALTER TABLE s_relations_new
DROP INDEX message_id_index;
- Eğer
COUNT(DISTINCT target_object_id)
> 4.000.000
- sonra
ALTER TABLE s_relations_new
DROP INDEX target_object_index;
Bu dizinlerin kullanışlılığı veya işe yaramazlığı belirlendikten sonra, verileri yeniden yükleyebilirsiniz
#
# Change the Column Name
# Load the Table
#
ALTER TABLE s_relations_new CHANGE sent_at sent_at_new int(11) DEFAULT NULL;
INSERT INTO s_relations_new SELECT * FROM s_relations;
Hepsi bu, değil mi? HAYIR !!!
Web siteniz bu süre boyunca tamamsa, s_relations_new yüklemesi sırasında s_relations ile çalışan INSERT'ler olabilir. Bu eksik satırları nasıl geri alabilirsiniz?
Git ve s_relations_new içindeki maksimum kimliği bulun ve bu kimlikten sonraki her şeyi s_relations'den ekleyin. Tablonun dondurulduğundan ve yalnızca bu güncelleştirme için kullanıldığından emin olmak için, s_relation_new'e eklenen son satırları almak için biraz çalışmamanız gerekir. İşte yapmanız gerekenler:
İşletim sisteminde, başka hiç kimsenin oturum açamaması, ancak root @ localhost (TCP / IP'yi devre dışı bırakır) için mysql'yi yeniden başlatın:
$ service mysql restart --skip-networking
Ardından, mysql'e giriş yapın ve bu son satırları yükleyin:
mysql> SELECT MAX(id) INTO @maxidnew FROM s_relations_new;
mysql> INSERT INTO s_relations_new SELECT * FROM s_relations WHERE id > @maxidnew;
mysql> ALTER TABLE s_relations RENAME s_relations_old;
mysql> ALTER TABLE s_relations_new RENAME s_relations;
Ardından, mysql'yi normal olarak yeniden başlatın
$ service mysql restart
Şimdi, mysql'i indiremiyorsanız, s_relations üzerinde bir yem ve anahtar yapmanız gerekecektir. MySQL'e giriş yapın ve aşağıdakileri yapın:
mysql> ALTER TABLE s_relations RENAME s_relations_old;
mysql> SELECT MAX(id) INTO @maxidnew FROM s_relations_new;
mysql> INSERT INTO s_relations_new SELECT * FROM s_relations_old WHERE id > @maxidnew;
mysql> ALTER TABLE s_relations_new RENAME s_relations;
Bir şans ver !!!
CAVEAT: Bu işlemden memnun kaldığınızda, eski masayı en kısa sürede düşürebilirsiniz:
mysql> DROP TABLE s_relations_old;
SHOW CREATE TABLE tblname\G
değiştirilmesi gereken sütunu, sütunun veri türünü ve sütunun yeni adını gösterin.