Mysql
 sql >> Datenbank >  >> RDS >> Mysql

mysql langsame abfrage

Das Folgende ist ziemlich schnell, dauert etwas mehr als 6 Minuten mit 10 Millionen Zeilen, aber die Beispieltabelle hat weniger Felder und Indizes als Ihre Produktionstabelle. Erwarten Sie also, dass es in Ihrem Fall etwas länger dauert, wenn Sie sich entscheiden, sie zu verwenden !

Hinweis:Das Beispiel wurde auf Windows-Betriebssystemen erstellt, daher müssen Sie Pfadnamen und \r\n in \n ändern, um den Linux-Standards zu entsprechen !

Hier ist meine vorhandene Tabelle (InnoDB-Engine):

drop table if exists customers;
create table customers
(
customer_id int unsigned not null auto_increment primary key,
name varchar(255) not null,
country_id tinyint unsigned not null default 0,
key (country_id)
)
engine=innodb;

mysql> select count(*) from customers;
+----------+
| count(*) |
+----------+
| 10000000 |
+----------+
1 row in set (1.78 sec)

Erstellen Sie eine neue Version der Tabelle, die das gewünschte neue Feld enthält:

drop table if exists customers_new;
create table customers_new
(
customer_id int unsigned not null auto_increment primary key,
name varchar(255) not null,
country_id tinyint unsigned not null default 0,
split tinyint not null default 0,
key (country_id)
)
engine=innodb;

Suchen Sie den Speicherort Ihres Uploads-Ordners:

select @@secure_file_priv;

Exportieren Sie die Daten in PK-Reihenfolge aus der alten Kundentabelle in das CSV-Format:

select * into outfile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\customers.dat'
fields terminated by '|' optionally enclosed by '"'
lines terminated by '\r\n'
from customers order by customer_id;

Query OK, 10000000 rows affected (17.39 sec)

Laden Sie die Datei customer.dat in die neue Kundentabelle:

truncate table customers_new;

set autocommit = 0;

load data infile 'C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\customers.dat'
into table customers_new
fields terminated by '|' optionally enclosed by '"'
lines terminated by '\r\n'
(
customer_id,
name,
country_id,
@dummy -- represents the new split field
)
set
name = nullif(name,'');

commit;

Query OK, 10000000 rows affected (6 min 0.14 sec)

Bestätigen Sie, dass die neue Tabelle in Ordnung aussieht:

select * from customers_new order by customer_id desc limit 1;
+-------------+-------------------+------------+-------+
| customer_id | name              | country_id | split |
+-------------+-------------------+------------+-------+
|    10000000 | customer 10000000 |        218 |     0 |
+-------------+-------------------+------------+-------+
1 row in set (0.00 sec)

insert into customers_new (name, country_id, split) values ('f00',1,1);
Query OK, 1 row affected (0.07 sec)

select * from customers_new order by customer_id desc limit 1;
+-------------+------+------------+-------+
| customer_id | name | country_id | split |
+-------------+------+------------+-------+
|    10000001 | f00  |          1 |     1 |
+-------------+------+------------+-------+
1 row in set (0.00 sec)

Löschen Sie die alte Tabelle und benennen Sie die neue um:

drop table customers;
Query OK, 0 rows affected (0.18 sec)

rename table customers_new to customers;
Query OK, 0 rows affected (0.05 sec)

select * from customers order by customer_id desc limit 1;
+-------------+------+------------+-------+
| customer_id | name | country_id | split |
+-------------+------+------------+-------+
|    10000001 | f00  |          1 |     1 |
+-------------+------+------------+-------+
1 row in set (0.00 sec)

Das war's, Leute!