MySQL медленный запрос - PullRequest
       7

MySQL медленный запрос

2 голосов
/ 14 марта 2011
ALTER TABLE customers ADD split INT(1);

10 мил. записи ... я выполнил эту команду в течение 1 часа и все еще загружаюсь .. есть ли способ сделать это быстрее?

Ответы [ 2 ]

6 голосов
/ 14 марта 2011

Следующее довольно быстро, занимает чуть более 6 минут с 10 миллионами строк, но пример таблицы содержит меньше полей и индексов, чем ваша производственная таблица, поэтому ожидайте, что в вашем случае это займет немного больше времени, если вы решите использовать его!

Примечание: пример был сделан для ОС Windows, поэтому вам придется изменить пути и \ r \ n на \ n, чтобы соответствовать стандартам linux!

вот моя существующая таблица (innodb engine ofc):

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;

экспорт данных в порядке ПК из старой таблицы клиентов в формат csv:

select * into outfile 'c:\\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:\\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 голос
/ 14 марта 2011

Вероятно, не по коду.
Закройте все другие приложения, убедитесь, что ничто другое не занимает ваше использование процессора, нет вредоносного ПО? получить более быстрый компьютер?
Было бы полезно, если бы вы сообщили нам настройку среды, с которой вы работаете, и тому подобное. Это может быть несколько вещей, связанных с вашей сетью, вашим сервером и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...