যৌগিক কীটির প্রথম অংশ হিসাবে DATETIME সহ প্রাথমিক কী সূচকটি কখনই ব্যবহৃত হয় না


17

আমার প্রাথমিক কী এর প্রথম অংশ হিসাবে একটি ডেটটাইম (বা একটি তারিখ) ইন্ডেক্স করাতে আমার সমস্যা আছে।

আমি মাইএসকিউএল 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 এর সাথে একই

এটা সত্যিই অদ্ভুত। আপনি যদি dateপরিবর্তে ব্যবহার করেন তবে কি একই ঘটে datetime?
ypercubeᵀᴹ

হ্যাঁ এটি ঠিক একই কাজ করে

1
আর যদি দৌড়ায় WHERE dateDim = DATE('2014-04-03 00:00:00')?
ypercubeᵀᴹ

1
পিকে পুনঃক্রমের সাথে এটি কাজ করে। তবে প্রকৃতপক্ষে, আমি যেখানে খণ্ডটিতে কেবল ডেটডিম এবং অ্যাকাউন্টডিম দিয়ে একটি অনুরোধ করতে চাই। আমি কেস স্টাডির জন্য সমস্ত

1
কোথায় তারিখের ডিম = তারিখ ('2014-04-03 00:00:00') => কিছুই পরিবর্তন হয়নি

উত্তর:


6

এটি 5.5.x এ একটি বাগ is এখানে দেখুন

এটি পরামর্শ দেয় যে আপনার ক্যোয়ারী হওয়া উচিত

SELECT * 
FROM `stats`  
WHERE 
   dateDim = CAST('2014-04-03 00:00:00' as datetime)
   AND accountDim = 4
   AND execCodeDim = 9
   AND operationTypeDim = 1
   AND junkDim = 5
   AND ipCountryDim = 3

1

যেহেতু টেবিলের ইনটি সংস্করণ

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 

ক্যোয়ারির নিরিখে ঠিকঠাক কাজ করে, আপনার ডেটডিমের ডেটটাইম স্ট্রিংয়ের UNIX_TIMESTAMP () থাকতে হবে । আপনার ক্যোয়ারী আরও দেখতে এইরকম হবে:

SELECT *        
FROM `stats`         
WHERE        
   dateDim = UNIX_TIMESTAMP('2014-04-03 00:00:00')
   AND accountDim = 4       
   AND execCodeDim = 9       
   AND operationTypeDim = 1       
   AND junkDim = 5       
   AND ipCountryDim = 3       
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.