আমার প্রাথমিক কী এর প্রথম অংশ হিসাবে একটি ডেটটাইম (বা একটি তারিখ) ইন্ডেক্স করাতে আমার সমস্যা আছে।
আমি মাইএসকিউএল 5.5 ব্যবহার করি
এখানে আমার দুটি টেবিল রয়েছে:
-- This is my standard table with dateDim as a dateTime
CREATE TABLE `stats` (
`dateDim` datetime NOT NULL,
`accountDim` mediumint(8) unsigned NOT NULL,
`execCodeDim` smallint(5) unsigned NOT NULL,
`operationTypeDim` tinyint(3) unsigned NOT NULL,
`junkDim` tinyint(3) unsigned NOT NULL,
`ipCountryDim` smallint(5) unsigned NOT NULL,
`count` int(10) unsigned NOT NULL,
`amount` bigint(20) NOT NULL,
PRIMARY KEY (`dateDim`,`accountDim`,`execCodeDim`,`operationTypeDim`,`junkDim`,`ipCountryDim`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
-- Here is a copy with datDim as an integer
CREATE TABLE `stats_todays` (
`dateDim` int(11) unsigned NOT NULL,
`accountDim` mediumint(8) unsigned NOT NULL,
`execCodeDim` smallint(5) unsigned NOT NULL,
`operationTypeDim` tinyint(3) unsigned NOT NULL,
`junkDim` tinyint(3) unsigned NOT NULL,
`ipCountryDim` smallint(5) unsigned NOT NULL,
`count` int(10) unsigned NOT NULL,
`amount` bigint(20) NOT NULL,
PRIMARY KEY (`dateDim`,`accountDim`,`execCodeDim`,`operationTypeDim`,`junkDim`,`ipCountryDim`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
আমি উভয় টেবিলটি ঠিক একই তথ্য দিয়ে পূর্ণ করি (প্রায় 10 000 000)
কিন্তু:
- তারিখের জন্য পরিসংখ্যান সারণী একটি DATETIME ব্যবহার করে
- স্ট্যাটাস_টোডয়েস তারিখের জন্য TO_DAYS () এর সাথে একটি INTEGER ব্যবহার করে
আমার প্রশ্ন: সূচকের প্রথম অংশটি যখন ডেটটাইম হয় তখন কেন মাইএসকিউএল প্রাথমিক কী ব্যবহার করে না ??? এটি খুব অদ্ভুত যেহেতু একই ডেটা সহ তবে একটি INTEGER এবং TO_DAYS (ডেটডিম) এর সাথে একই অনুরোধ শিলার সাথে একীভূত ....
পরিসংখ্যান সারণীর (এবং তারিখের সময়) সহ উদাহরণ:
SELECT *
FROM `stats`
WHERE
dateDim = '2014-04-03 00:00:00'
AND accountDim = 4
AND execCodeDim = 9
AND operationTypeDim = 1
AND junkDim = 5
AND ipCountryDim = 3
=> 1 result (4.5sec)
Explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stats ALL NULL NULL NULL NULL 8832329 Using where
অন্যান্য টেবিলের একই অনুরোধ stats_todays (INTEGER এবং TO_DAYS সহ) ()
EXPLAIN SELECT *
FROM `stats_todays`
WHERE
dateDim = TO_DAYS('2014-04-03 00:00:00')
AND accountDim = 4
AND execCodeDim = 9
AND operationTypeDim = 1
AND junkDim = 5
AND ipCountryDim = 3
=> Result 1 row (0.0003 sec)
Explain:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE stats_todays const PRIMARY PRIMARY 13 const,const,const,const,const,const 1
আপনি যদি পুরো পোস্টটি পড়েন তবে আপনি বুঝতে পারবেন যে কোনও নিম্ন কার্ডিনালিটি সমস্যা নয় কারণ অনুরোধটি একটি আন্তঃ তারিখের সাথে একই কার্ডিনালিটির সাথে কাজ করে ....
এখানে কিছু উন্নত বিবরণ দেওয়া হল:
SELECT COUNT( DISTINCT dateDim )
FROM stats_todays
UNION ALL
SELECT COUNT( DISTINCT dateDim )
FROM stats;
Result:
COUNT(DISTINCT dateDim)
2192
2192
এখানে আইএনডেক্স বর্ণনা:
SHOW INDEXES FROM `stats`
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
stats 0 PRIMARY 1 dateDim A 6921 NULL NULL BTREE
stats 0 PRIMARY 2 accountDim A 883232 NULL NULL BTREE
stats 0 PRIMARY 3 execCodeDim A 8832329 NULL NULL BTREE
stats 0 PRIMARY 4 operationTypeDim A 8832329 NULL NULL BTREE
stats 0 PRIMARY 5 junkDim A 8832329 NULL NULL BTREE
stats 0 PRIMARY 6 ipCountryDim A 8832329 NULL NULL BTREE
SHOW INDEXES FROM `stats_todays`
Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment Index_comment
stats_todays 0 PRIMARY 1 dateDim A 7518 NULL NULL BTREE
stats_todays 0 PRIMARY 2 accountDim A 4022582 NULL NULL BTREE
stats_todays 0 PRIMARY 3 execCodeDim A 8045164 NULL NULL BTREE
stats_todays 0 PRIMARY 4 operationTypeDim A 8045164 NULL NULL BTREE
stats_todays 0 PRIMARY 5 junkDim A 8045164 NULL NULL BTREE
stats_todays 0 PRIMARY 6 ipCountryDim A 8045164 NULL NULL BTREE
তারিখ নির্বাচন করুন ডিমে, COUNT (*) পরিসংখ্যান থেকে গ্রাহক তারিখ অনুসারে রোলআপের সাথে
- 2192 টি বিভিন্ন তারিখ রয়েছে বলে জানায় এবং পুনরায় ভাগটি মসৃণ হয় (তারিখ অনুসারে 3000 - 4000 সারি)
- টেবিলটিতে 8 831 990 সারি রয়েছে
- অন্য টেবিলের জন্য একই
- আমি কভারিং ইন্ডেক্স (সমস্ত পিকে কলাম দ্বারা * প্রতিস্থাপন করে) => কিছুই পরিবর্তন হয়নি tried
- আমি বল প্রয়োগ করার চেষ্টা করেছি | ব্যবহার সূচক => কিছুই পরিবর্তন হয়নি
- তারিখের পরিবর্তে তারিখের ক্ষেত্রের সাথে একই
- প্রাথমিক কী পরিবর্তে INDEX বা UNIQUE এর সাথে একই
WHERE dateDim = DATE('2014-04-03 00:00:00')
?
date
পরিবর্তে ব্যবহার করেন তবে কি একই ঘটেdatetime
?