5

मेरी धीमी क्वेरी लॉग में जब मैं का उपयोग कर प्रोफाइलर के माध्यम से धीमी गति से क्वेरी चलाने मैं की तरहMySQL धीमी क्वेरी सूचकांक का उपयोग करता है और धीमी गति से नहीं है जब मैं इसे प्रोफाइलर के माध्यम से चलाने

 
# Time: 121107 16:34:02 
# [email protected]: web_node[web_node] @ localhost [127.0.0.1] 
# Thread_id: 34436186 Schema: test_db Last_errno: 0 Killed: 0 
# Query_time: 1.413751 Lock_time: 0.000222 Rows_sent: 203 Rows_examined: 203 Rows_affected: 0 Rows_read: 203 
# Bytes_sent: 7553 Tmp_tables: 0 Tmp_disk_tables: 0 Tmp_table_sizes: 0 
# InnoDB_trx_id: 9B04384 
SET timestamp=1352334842; 
SELECT id, email FROM test_data WHERE id IN (13089576,3002681,3117763,1622233,2941590,12305279,1732672,2446772,3189510,13084725,4943929,5855071,6572137,2266261,3003496,2024860,3336832,13758671,6477694,1796684,13001771,4690025,1071744,1017876,5175795,795988,1619821,2481819,2941090,4770802,13438250,3254708,2323402,526303,13219855,3313573,3190479,1733761,3300577,2941758,6474118,1733379,11523598,4205064,6521805,2492903,1860388,3337093,5205317,1213970,5442738,12194039,1214203,12970536,3076611,3126152,3677156,5305021,2751587,4954875,875480,2105172,5309382,12981920,5204330,13729768,3254503,5030441,2680750,590661,1338572,7272410,1860386,2567550,5434143,1918035,5329411,1683235,3254119,5175784,1855380,3336834,2102567,4749746,37269,3207031,6464336,2227907,2713471,3937600,2940442,2233821,5619141,5204711,5988803,5050821,10109926,5226877,5050275,1874115,13677832,5338699,2423773,6432937,6443660,1990611,6090667,6527411,6568731,3254846,3414049,2011907,5180984,12178711,8558260,3130655,5864745,2059318,3480233,2104948,2387703,1939395,5356002,2681209,1184622,1184456,10390165,510854,7983305,795991,2622393,4490187,9436477,5356051,2423464,5205318,1600499,13623229,3255205,12200483,6477706,3445661,5226284,1176639,13760962,2101681,6022818,12909371,1732457,2377496,7260091,12191702,2492899,2630691,13047691,1684470,9382108,2233737,13117701,1796698,2535914,4941741,4565958,1100410,2321180,13080467,813342,4563877,4689365,2104756,1102802,2714488,3188947,1599770,1558291,5592740,5233428,5204830,1574452,3188956,13693326,2102349,3704111,1748303,790889,9323280,4741494,2387900,5338213,3583795,2283942,3189482,3002296,4490123,3585020,962926,3481423,1600920,1682364,4693123,6487778,2677582,2377195);

धीमी गति से प्रश्नों देख रहा हूँ कि SQL_NO_CACHE यह लग रहा है का कहना है

 
203 rows in set (0.03 sec) 

show profile for query 33; 
+----------------------+----------+ 
| Status    | Duration | 
+----------------------+----------+ 
| starting    | 0.000187 | 
| checking permissions | 0.000012 | 
| Opening tables  | 0.000034 | 
| System lock   | 0.000016 | 
| init     | 0.000087 | 
| optimizing   | 0.000024 | 
| statistics   | 0.028694 | 
| preparing   | 0.000074 | 
| executing   | 0.000005 | 
| Sending data   | 0.001596 | 
| end     | 0.000009 | 
| query end   | 0.000008 | 
| closing tables  | 0.000014 | 
| freeing items  | 0.001600 | 
| logging slow query | 0.000007 | 
| cleaning up   | 0.000011 | 
+----------------------+----------+ 

जब मैं समझाता यह कहता है

 
+----+-------------+------------------+-------+------------------+----------+---------+------+------+--------------------------+ 
| id | select_type | table   | type | possible_keys | key  | key_len | ref | rows | Extra     | 
+----+-------------+------------------+-------+------------------+----------+---------+------+------+--------------------------+ 
| 1 | SIMPLE  | test_data  | range | PRIMARY,id_email | id_email | 4  | NULL | 203 | Using where; Using index | 
+----+-------------+------------------+-------+------------------+----------+---------+------+------+--------------------------+ 

साथ क्वेरी चलाने तालिका रूप दे रों तरह

 
CREATE TABLE `test_data` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `email` varchar(254) DEFAULT NULL, 
    `domain` varchar(254) DEFAULT NULL, 
    `age` smallint(6) DEFAULT NULL, 
    `gender` tinyint(1) DEFAULT NULL, 
    `location_id` int(11) unsigned DEFAULT NULL, 
    `created` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `unistall_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `subscription_date` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', 
    `active` tinyint(1) DEFAULT '1', 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `email` (`email`), 
    KEY `domain` (`domain`), 
    KEY `id_email` (`id`,`email`), 
    KEY `email_id` (`email`,`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=13848530 DEFAULT CHARSET=utf8 

किसी अन्य क्वेरी कि नियमित रूप से चला जाता है ईमेल पतों की एक सूची से आईडी और ईमेल का चयन इसलिए ईमेल, आईडी कुंजी, ईमेल पता इसलिए क्यों कि एक अद्वितीय कुंजी है अद्वितीय होने चाहिए नहीं है। तालिका में केवल ~ 14 एम पंक्तियां हैं

मैंने सोचा कि शायद इंडेक्स जहां स्मृति और स्वैपिंग के लिए बड़ा हो रहा है लेकिन बॉक्स में 8 गीगा रैम है।

 
SELECT table_schema "Data Base Name", SUM(data_length + index_length)/1024/1024 "Data Base Size in MB", SUM(index_length)/1024/1024 "Index Size in MB" FROM information_schema.TABLES GROUP BY table_schema; 
+--------------------+----------------------+------------------+ 
| Data Base Name  | Data Base Size in MB | Index Size in MB | 
+--------------------+----------------------+------------------+ 
| metrics   |  3192.50000000 | 1594.42187500 | 
| data    |  8096.48437500 | 5639.51562500 | 
| raw_data   |  6000.35937500 |  745.07812500 | 
| information_schema |   0.00878906 |  0.00878906 | 
| mysql    |   0.04319191 |  0.04101563 | 
| performance_schema |   0.00000000 |  0.00000000 | 
+--------------------+----------------------+------------------+ 

स्थापना my.cnf फ़ाइल में innodb_file_per_table = 1 समस्या हल हो जाती है प्रकट होता है।

यह निष्पादन समय में सुधार हुआ, मेरी समझ यह है कि प्रति तालिका एकल फ़ाइल होने का मतलब है कि डिस्क सुई को इतनी बड़ी दूरी को स्थानांतरित करने की आवश्यकता नहीं है।

प्रश्न

  1. क्वेरी अनुक्रमणिका का उपयोग कर मूल्यांकन किया जा सकता है, तो क्यों की स्थापना करता है innodb_file_per_table = 1 प्रदर्शन
  2. में सुधार क्यों नहीं है क्वेरी धीमी गति से जब यह कैश का उपयोग किए बिना प्रोफाइलर के लिए चलाया जाता है ?
  3. क्या मेरी प्राथमिक कुंजी (आईडी, ईमेल) होनी चाहिए?

अद्यतन

मूल रूप से कोई /etc/my.cnf फ़ाइल था तो मैं निम्नलिखित

 
[mysqld] 
server-id=1 
max_connections=1500 
key_buffer_size=50M 
query_cache_limit=16M 
query_cache_size=256M 
thread_cache=16 
table_open_cache=4096 
sort_buffer_size=512K 
join_buffer_size=8M 
read_buffer_size=8M 
skip_name_resolve=1 
thread_cache_size=256 
innodb_buffer_pool_size=6G 
innodb_buffer_pool_instances=1 
innodb_thread_concurrency=96 
innodb_additional_mem_pool_size=32M 
innodb_log_buffer_size=8M 
innodb_flush_log_at_trx_commit=0 
innodb_log_file_size=256M 
innodb_flush_method=O_DIRECT 
innodb_file_per_table=1 
net_read_timeout=15 
net_write_timeout=30 
log-bin=mysql-bin 
sync_binlog=0 
datadir=/var/lib/mysql 

उत्तर

3

के साथ एक बनाया आप अपने innodb_log_buffer के लिए बहुत अधिक डेटा है।

innodb_buffer_pool_size 
innodb_log_file_size 

InnoDB के सभी स्मृति में चलाना चाहिए:

का उद्देश्य क्या हैं। जब आप फ़ाइलों को विभाजित करते हैं तो यह अधिक कुशलता से चल रहा है क्योंकि यह कम डिस्क पढ़ने और लिखने के साथ मेमोरी में और बाहर स्वैप कर रहा है क्योंकि एक बड़ी फ़ाइल डेटा के लिए स्कैन करने में अधिक समय लेती है।

यह स्वैपिंग नहीं है क्योंकि आपका innodb_buffer_pool_size स्मृति की मात्रा को बाधित कर रहा है जो MySQL स्मृति में लोड हो जाता है।

आपकी समस्या को ठीक करने का एकमात्र तरीका अधिक स्मृति प्राप्त होता है और आपके सभी innodb टेबल और अनुक्रमणिका के लिए पर्याप्त innodb_buffer_pool_size आवंटित करता है।

+0

स्पष्टीकरण के लिए धन्यवाद मैंने आपके प्रश्न के उत्तर के साथ मूल प्रश्न अपडेट किया। – Ben

+1

हाँ - innodb_buffer_pool_size = 6G - आपका डेटा उसमें फिट नहीं होगा। आपके पास 16.8 जीबी डेटा + इंडेक्स है। यदि आप स्मृति बढ़ा सकते हैं, तो यह आपकी सबसे अच्छी शर्त है, अन्यथा, मैं कुछ डेटा को एक आर्किविवे टेबल पर ले जाने पर विचार करता हूं। – Michael