Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

mysql धीमी क्वेरी

निम्नलिखित बहुत तेज़ है, 10 मिलियन पंक्तियों के साथ 6 मिनट से थोड़ा अधिक समय लेता है लेकिन उदाहरण तालिका में आपकी उत्पादन तालिका की तुलना में कम फ़ील्ड और अनुक्रमणिकाएं हैं, इसलिए यदि आप इसका उपयोग करने का निर्णय लेते हैं तो आपके मामले में थोड़ा अधिक समय लगने की अपेक्षा करें!

नोट:उदाहरण विंडोज़ ओएस पर किया गया था, इसलिए आपको पथनाम और \r\n को \n में बदलना होगा ताकि लिनक्स मानकों के अनुरूप हो !

यहां मेरी मौजूदा तालिका है (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;

पीके क्रम में डेटा को पुरानी ग्राहक तालिका से सीएसवी प्रारूप में निर्यात करें:

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. मैं इस SQL ​​​​कथन को Django QuerySet में कैसे परिवर्तित कर सकता हूं?

  2. MySQL फ़ंक्शन किसी क्वेरी से मान लौटाता है

  3. मैं mysqld_safe चल रहे परिदृश्य में mysql का पासवर्ड कैसे सेट कर सकता हूं?

  4. एक mysql तालिका में php से श्रेणी का नाम स्टोर करने का सबसे अच्छा तरीका

  5. रखरखाव कार्यों को स्वचालित करने के लिए डेटाबेस बैकअप सलाहकारों का उपयोग करना