Mysql
 sql >> база данни >  >> RDS >> Mysql

mysql бавна заявка

Следното е доста бързо, отнема малко над 6 минути с 10 милиона реда, но примерната таблица има по-малко полета и индекси от вашата производствена таблица, така че очаквайте да отнеме малко повече време във вашия случай, ако решите да я използвате!

Забележка:примерът е направен на Windows OS, така че ще трябва да промените имената на пътищата и \r\n на \n, за да отговаряте на стандартите на Linux!

Ето моята съществуваща таблица (InnoDB машина):

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)

Създайте нова версия на таблицата, която включва новото поле, което ви е необходимо:

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;

Намерете местоположението на папката си за качвания:

select @@secure_file_priv;

Експортирайте данните в PK ред от старата таблица с клиенти във формат csv:

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)

Заредете файла customer.dat в новата таблица с клиенти:

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)

Потвърдете, че новата таблица изглежда добре:

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)

Изхвърлете старата таблица и преименувайте нова:

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)

Това е всичко, хора!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам REGEXP с escape последователности като граница на думите?

  2. Помощ при SQL заявка за намиране на следващата свободна дата за система за резервации

  3. Как да накарате вашето булево търсене в пълен текст да вземе термина C++?

  4. mysql PDO и динамично SQL инжектиране на съхранена процедура

  5. java.sql.Разширение за връзка за SSH