J'ai une table
| base_schedule_line_items | CRÉER UNE TABLE
base_schedule_line_items
(id
int (10) non signé NOT NULL AUTO_INCREMENT,installment
int (10) unsigned NOT NULL,on_date
date NOT NULL,actual_date
date DEFAULT NULL,payment_type
int (11) NOT NULL,scheduled_principal_outstanding
décimal (65,0) NOT NULL,scheduled_principal_due
décimal (65,0) NOT NULL,scheduled_interest_outstanding
décimal (65,0) NOT NULL,scheduled_interest_due
décimal (65,0) NOT NULL,currency
int (11) NOT NULL,updated_at
datetime NOT NULL DEFAULT '2013-01-06 14:29:16',created_at
datetime NOT NULL DEFAULT '2013-01-06 14:29:16',loan_base_schedule_id
int (10) non signé NOT NULL,lending_id
int (10) non signé NOT NULL,reschedule
tinyint (1) PAR DÉFAUT '0',
CLÉ PRIMAIRE (id
),
TOUCHEindex_base_schedule_line_items_loan_base_schedule
(loan_base_schedule_id
), CLÉindex_bslt_spd
(scheduled_principal_due
),
TOUCHEindex_bslt_lending
(lending_id
),
TOUCHEindex_bslt_actualdate
(actual_date
),
TOUCHEindex_bslt_spsila
(loan_base_schedule_id
,scheduled_principal_due
,scheduled_interest_due
,actual_date
),
TOUCHEindex_bslt_ondate
(on_date
),
TOUCHEindex_bslt_oa
(on_date
,actual_date
),
TOUCHEindex_bslt_ol
(on_date
,loan_base_schedule_id
),
TOUCHEindex_bslt_oli
(on_date
,lending_id
)
) MOTEUR = InnoDB AUTO_INCREMENT = 30410126 CHARGES PAR DEFAUT = utf8 |
Maintenant que cette table contient 30 millions d'enregistrements, j'ai besoin d'ajouter deux autres index à cela et il faut des années pour l'ajouter.
modifier la table base_schedule_line_items add index index_bslt_sla (schedule_principal_due, actual_date, lending_id);
modifier la table base_schedule_line_items add index index_bslt_ssla (schedule_principal_due, schedule_interest_due, lending_id, actual_date);
J'ai utilisé la requête mentionnée ci-dessous pour connaître la taille de la table
SELECT table_name AS "Tables", round (((data_length + index_length)/1024/1024), 2) "Size in MB" FROM information_schema.TABLES WHERE table_schema = "my_database_name";
Le résultat est sorti comme
base_schedule_line_items | 20111.00
Je l'ai utilisé juste pour calculer la longueur des données et la longueur d'index omise
SELECT table_name AS "Tables", round (((data_length)/1024/1024), 2) "Size in MB" FROM information_schema.TABLES WHERE table_schema = "my_database_name";
et le résultat était
base_schedule_line_items | 9497,00
Les index
KEY index_bslt_actualdate (actual_date),
KEY index_bslt_spsila (loan_base_schedule_id, schedule_principal_due, schedule_interest_due, actual_date),
KEY index_bslt_ondate (on_date),
KEY index_bslt_oa (on_date, actual_date),
KEY index_bslt_ol (on_date, loan_base_schedule_id),
KEY index_bslt_oli (on_date, lending_id)
ont été ajoutés par moi, mais je ne sais pas trop dans quel but d'autres indices ont été ajoutés. Il s'agit d'une application assez importante. Maintenant, je dois ajouter ces deux indices mentionnés ci-dessus car ils m'aident à extraire un rapport à l'aide d'une instruction select et je trouve qu'il est très difficile de les ajouter. Toute aide serait grandement appréciée
L'activité de modification des grandes tables se fait en plusieurs phases:
RENAME table ur_db.table_name to test.temp, test.table_name to ur_db.table_name, test.temp to test.table_name;
Il s'agit d'une opération atomique prenant une fraction de seconde.Quelques notes:
SHOW TABLE STATUS from db like 'table_name'
index_bslt_ondate, index_base_schedule_line_items_loan_base_schedule
car certains autres index ont la colonne la plus à gauche comme colonne indexéeVeuillez me faire savoir si vous avez besoin d'éclaircissements sur l'une de ces étapes.
Edit: Un simple script python pour automatiser le processus https://github.com/georgecj11/hotswap_mysql_table.git
Vous pouvez utiliser un outil comme pt-online-schema-change pour ajouter l'index sans bloquer votre application. La logique de base est la suivante:
* L'outil ne fonctionne pas s'il y a des déclencheurs existants sur la table
Le comportement de permutation et de suppression peut être ajusté en fonction des options transmises à l'outil.
En outre, il existe des problèmes avec les clés étrangères, alors assurez-vous de lire la documentation de l'outil pour bien comprendre ce qu'il fait.
Et bien sûr, il est sage de s'assurer que vous disposez d'une sauvegarde de la table pour pouvoir la restaurer si nécessaire.