ইনডেক্সড ডেটটাইম কলাম ব্যবহার করে মাইএসকিউএল সম্পাদনা সমস্যা


15

আমি এখন প্রায় এক ঘন্টার জন্য নিম্নলিখিত সমস্যাটি সমাধান করার চেষ্টা করেছি এবং এখনও এটির সাথে আর পাইনি।

ঠিক আছে, আমার কাছে একটি টেবিল রয়েছে (মাইআইএসএএম):

+---------+-------------+------+-----+-------------------+----------------+
| Field   | Type        | Null | Key | Default           | Extra          |
+---------+-------------+------+-----+-------------------+----------------+
| id      | int(11)     | NO   | PRI | NULL              | auto_increment |
| http    | smallint(3) | YES  | MUL | 200               |                |
| elapsed | float(6,3)  | NO   |     | NULL              |                |
| cached  | tinyint(1)  | YES  |     | NULL              |                |
| ip      | int(11)     | NO   |     | NULL              |                |
| date    | timestamp   | NO   | MUL | CURRENT_TIMESTAMP |                |
+---------+-------------+------+-----+-------------------+----------------+

অনুগ্রহ করে কিছু মনে করবেন না, আমি সমাধান খুঁজে বের করার চেষ্টা করছি। এখন, আমার জিজ্ঞাসা এখানে।

SELECT http,
COUNT( http )  AS count 
FROM reqs
WHERE DATE(date) >= cast(date_sub(date(NOW()),interval 24 hour) as datetime)
GROUP BY http
ORDER BY count;

টেবিলটি ইনকামিং ওয়েব রিকোয়েস্ট সম্পর্কিত তথ্য সংরক্ষণ করছে যাতে এটির পরিবর্তে এটি একটি বড় ডাটাবেস।

+-----------+
| count(id) |
+-----------+
|    782412 |
+-----------+

নোট করুন যে প্রাথমিক কী সেট করার আর ভাল উপায় আর নেই কারণ আইডি কলামটি আমার একমাত্র অনন্য শনাক্তকারী হবে। উপরে উল্লিখিত ক্যোয়ারিটি চালাতে প্রায় 0.6-1.6 সেকেন্ড সময় নেয়।

কোন সূচকটি চালাক হবে? আমি অনুভব করেছি যে সূচীকরণের তারিখটি আমাকে "খারাপ" কার্ডিনালিটি দেবে এবং এভাবে মাইএসকিউএল এটি ব্যবহার করবে না। HTTPশুধুমাত্র প্রায় 20 টি বিভিন্ন সম্ভাব্য মান রয়েছে বলে একটি খারাপ পছন্দ।

আপনার সহযোগিতার জন্য ধন্যবাদ!

1 আপডেট করুন আমি ইপারকিউবের পরামর্শ অনুসারে (HTTP, তারিখ) তে একটি সূচক যুক্ত করেছি :

mysql> CREATE INDEX httpDate ON reqs (http, date);

এবং তার ক্যোয়ারী ব্যবহার করেছে, তবে এটি সমানভাবে খারাপ অভিনয় করেছে। যুক্ত সূচক:

+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+
| reqs  |          0 | PRIMARY  |            1 | id          | A         |      798869 |     NULL | NULL   |      | BTREE      |         |
| reqs  |          1 | httpDate |            1 | http        | A         |          19 |     NULL | NULL   | YES  | BTREE      |         |
| reqs  |          1 | httpDate |            2 | date        | A         |       99858 |     NULL | NULL   |      | BTREE      |         |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+

এবং ব্যাখ্যা

+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
| id | select_type        | table | type  | possible_keys | key      | key_len | ref  | rows  | Extra                                                     |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+
|  1 | PRIMARY            | r     | range | NULL          | httpDate | 3       | NULL |    20 | Using index for group-by; Using temporary; Using filesort |
|  2 | DEPENDENT SUBQUERY | ri    | ref   | httpDate      | httpDate | 3       | func | 41768 | Using where; Using index                                  |
+----+--------------------+-------+-------+---------------+----------+---------+------+-------+-----------------------------------------------------------+

মাইএসকিউএল সার্ভার সংস্করণ:

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+---------------------+
| Variable_name           | Value               |
+-------------------------+---------------------+
| protocol_version        | 10                  |
| version                 | 5.1.73              |
| version_comment         | Source distribution |
| version_compile_machine | x86_64              |
| version_compile_os      | redhat-linux-gnu    |
+-------------------------+---------------------+
5 rows in set (0.00 sec)

আপনি কি মাইএসকিএল সংস্করণ যুক্ত করতে পারেন এবং টেবিলের ইঞ্জিনটি কী? (মাইসাম বা ইনোডাব)
ইপারকিউবিᵀᴹ

মাইআইএসএএম এবং 5.1.73 - সমস্ত বিবরণ পোস্টে।
রবিন হেলার

আমি আশঙ্কা করছি এটি httpকলামটি বাতিল হওয়ার সাথে করতে পারে । আমি কাল খতিয়ে দেখব, সময় পেলে।
ypercubeᵀᴹ

আমি ভয় পাচ্ছি যে এটির সাথে http কলামটি নালাগুলি হতে পারে। আমি কাল খতিয়ে দেখব, সময় পেলে। আপনি (সাধারণ আলোচনা ছাড়া একটি অভিন্ন টেবিল তৈরি করে পরীক্ষা করতে পারেন http NOT NULL) এবং সমস্ত ডেটা এটি কপি (HTTP শূন্য অবশ্যই সঙ্গে সারি ব্যতীত।)
ypercubeᵀᴹ

এটিকে নাল নূলে পরিবর্তন করা (যা পুরোপুরি সম্ভব, টেবিলটি তৈরি করার সময় আমি এটাকে খুব বেশি কিছু মনে করি না) ক্যোয়ারীর (আমার ক্যোয়ারী) জন্য প্রায় ~ 1s - 1.6s এর পারফরম্যান্সকে বাড়িয়ে তুলেছে। এখনও অবধি আপনার প্রচেষ্টার জন্য ধন্যবাদ
রবিন হেলার

উত্তর:


10

আমার কাছে তিনটি পরামর্শ রয়েছে

পরামর্শ # 1: কোয়েরিটি আবার লিখুন

নিম্নলিখিত হিসাবে আপনার প্রশ্নের পুনরায় লেখা উচিত

SELECT http,
COUNT( http )  AS count 
FROM reqs
WHERE date >= ( DATE(NOW() - INTERVAL 1 DAY) + INTERVAL 0 SECOND )
GROUP BY http
ORDER BY count;

অথবা

SELECT * FROM
(
    SELECT http,
    COUNT( http )  AS count 
    FROM reqs
    WHERE date >= ( DATE(NOW() - INTERVAL 1 DAY) + INTERVAL 0 SECOND )
    GROUP BY http
) A ORDER BY count;

সমান চিহ্নের উভয় পক্ষের যেখানে ফাংশন করা উচিত নয়। সমান চিহ্নের বাম পাশে তারিখ থাকা ক্যোরি অপটিমাইজারের পক্ষে এর বিরুদ্ধে সূচক ব্যবহার করা সহজ করে তোলে।

পরামর্শ # 2: সহায়ক সূচক

আমি একটি আলাদা সূচকও পরামর্শ দেব

ALTER TABLE reqs ADD INDEX date_http_ndx (date,http); -- not (http,date) 

আমি কলামগুলির এই ক্রমটির পরামর্শ দিচ্ছি কারণ dateএন্ট্রিগুলি সমস্ত সূচকের সাথে মিলে যায়। তারপরে, কোয়েরিটি httpফাঁকগুলি ফাঁক না করেই মানগুলি সংগ্রহ করে http

পরামর্শ # 3: বড় কী বাফার (ptionচ্ছিক)

মাইআইএসএএম কেবল সূচক ক্যাচিং ব্যবহার করে। যেহেতু ক্যোয়ারিতে .MYDফাইলটি স্পর্শ করা উচিত নয় , আপনার কিছুটা বড় মাইসাম কী বাফার ব্যবহার করা উচিত।

এটি 256M এ সেট করতে

SET @newsize = 1024 * 1024 * 256;
SET GLOBAL key_buffer_size = @newsize;

তারপরে, এটি সেট করুন my.cnf

[mysqld]
key_buffer_size = 256M

মাইএসকিউএল পুনরায় চালু করার প্রয়োজন নেই

একবার চেষ্টা করে দেখো !!!


আপনি আমাকে যে প্রশ্ন দিয়েছেন তা আমি চেষ্টা করেছিলাম। # 1 অন্যান্য পরামর্শ বা আমার নিজের মতোই পারফর্ম করেছে, দ্বিতীয়টি আসলে আরও খারাপ করেছে। সহায়ক সূচকের জন্য একই জিনিস - প্রায় 75 শতাংশ পারফরম্যান্স হ্রাস করুন। আমি এখন আরও বড় কী বাফার চেষ্টা করতে যাচ্ছি, যাইহোক আপনাকে ধন্যবাদ!
রবিন হেলার

আমি আপনার উত্তরটি মেনে নিয়েছি যদিও এটি সমস্যার সমাধান না করে, একটি বড় কী বাফার সহ তবে এটি কিছুটা আরও ভাল পারফরম্যান্স করেছে। এটি প্রদত্ত সকলের মধ্যে সলিউশন হিসাবে এটি বন্ধ করা। ধন্যবাদ!
রবিন হেলার

পরামর্শ # 2 কাজ করার জন্য, ক্যোয়ারিতে "USE INDEX" বা "ফোর্স আইএনডিএক্স" যুক্ত করা প্রয়োজন হতে পারে, কমপক্ষে এটিই একটি সূচক তৈরির পরে আমার প্রশ্নের গতি বাড়ানোর জন্য আমাকে করতে হয়েছিল।
জোহানো ফেয়েরা

-2

আপনার তারিখ কলামের ধরণটি পূর্ণসংখ্যায় পরিবর্তন করুন। পূর্ণসংখ্যায় ইউনিক্স তারিখ হিসাবে তারিখটি সংরক্ষণ করুন। টাইমস্ট্যাম্প একটি int এর চেয়ে অনেক বড়। আপনি এটি থেকে কিছু ঠাঁই পেতে চাই।


2
তুমি কি মজা করছ? উভয় INTএবং TIMESTAMP4 বাইট প্রয়োজন।
ypercubeᵀᴹ

2
এটি উল্লেখ করবেন না যে আপনি যখন ইন্টিজার হিসাবে তারিখ বা টাইমস্ট্যাম্পগুলি সংরক্ষণ করেন তখন আপনি সমস্ত ডেটটাইম ফাংশন হারাবেন।
ypercubeᵀᴹ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.