Mysql
 sql >> Baza danych >  >> RDS >> Mysql

mysql wolne zapytanie

Poniższe jest dość szybkie, zajmuje nieco ponad 6 minut z 10 milionami wierszy, ale przykładowa tabela ma mniej pól i indeksów niż tabela produkcyjna, więc spodziewaj się, że w twoim przypadku zajmie to trochę więcej czasu, jeśli zdecydujesz się z niej skorzystać!

Uwaga:przykład został wykonany w systemie operacyjnym Windows, więc będziesz musiał zmienić nazwy ścieżek i \r\n na \n, aby dostosować się do standardów linuksowych!

Oto moja istniejąca tabela (silnik 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)

Utwórz nową wersję tabeli, która zawiera nowe wymagane pole:

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;

Znajdź lokalizację swojego folderu Przesłane:

select @@secure_file_priv;

Eksportuj dane w kolejności PK ze starej tabeli klientów do formatu 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)

Załaduj plik customer.dat do nowej tabeli klientów:

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)

Potwierdź, że nowa tabela wygląda dobrze:

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)

Upuść starą tabelę i zmień nazwę nowej:

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)

To wszystko ludzie!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak połączyć typy danych, takie jak integers (integer z integer) i varchar (varchar z varchar) w mysql?

  2. Baza danych Python i MySQL:praktyczne wprowadzenie

  3. Wartość strefy czasowej serwera „AEST” jest nierozpoznana lub reprezentuje więcej niż jedną strefę czasową

  4. Czy ustawić domyślną wartość dla kolumny typu DATE na bieżącą datę bez części czasowej?

  5. MySQL Gdzie DateTime jest większy niż dzisiaj