Friday, April 22, 2016

MySQL के साथ गणित

The Original post: http://anothermysqldba.blogspot.com/2016/04/math-with-mysql.html

मैंने सोचा कि मैं बहुत पहले इस पोस्ट ... ओह अच्छी तरह से ....

हम सभी जानते हैं कि गणित और सभी के जीवन की मूलभूत पहलू आम यदि परे नहीं दुनिया भर में इस्तेमाल भाषा है। MySQL, सभी डेटाबेस की तरह, गणित के कई पहलुओं के साथ मदद कर सकते हैं।

यहाँ कार्यों की एक सूची है: https://dev.mysql.com/doc/refman/5.6/en/mathematical-functions.html

यहाँ कुछ सरल उदाहरण आप शुरू कर रहे हैं।
  • द्विघात फॉर्मूला कुल्हाड़ी ^ 2 + bx + c = 0

# 2x^2 – 4x – 3 = 0.
SET @a= 1;
SET @b= 3;
SET @c= -4;
SET @XX = ( -(@b) - SQRT( POW(@b,2) -4 * @a * @c) / POW(@a,2) ) ;
SET @YY = ( -(@b) + SQRT( POW(@b,2) -4 * @a * @c) / POW(@a,2) ) ;
SET @XXX = MOD(@YY, @XX);

SELECT @XX / @XXX as X;
+------+
| X |
+------+
| -4 |
+------+
SELECT @YY / @XXX as X ;
+------+
| X |
+------+
| 1 |
+------+

  • पाइथागोरस प्रमेय (ज्यामिति 101 याद): एक ^ 2 + b ^ 2 = सी ^ 2

SET @A = 14;
SET @B = 48;
SELECT @C := SQRT(POW(@A,2) + POW(@B,2) );
+-------------------------------------+
| @C := SQRT(POW(@A,2) + POW(@B,2) ) |
+-------------------------------------+
| 50 |
+-------------------------------------+


तो यह है कि सी को हल करती है और निश्चित रूप से आप इस का उपयोग एक के लिए हल करने के लिए के रूप में अच्छी तरह से।

SELECT @A := SQRT(POW(@C,2) - POW(@B,2)) ;
+-----------------------------------+
| @A := SQRT(POW(@C,2) - POW(@B,2)) |
+-----------------------------------+
| 14 |
+-----------------------------------+


  • लघुगणक और अपनी पहचान को लॉग इन करें XY = लॉग इन करने के लिए लॉग इन x + y
http://www.businessinsider.com/the-17-equations-that-changed-the-world-2012-7#the-logarithm-and-its-identities-2


SET @X = 2;
SET @Y = 3;
SELECT concat(log(@X * @Y) ,' = ', log(@X) + log(@Y) ) as "logarithm and its identities" ;
+---------------------------------------+
| logarithm and its identities |
+---------------------------------------+
| 1.791759469228055 = 1.791759469228055 |
+---------------------------------------+

  • polyhedra के लिए यूलर सूत्र: एफ - ई + V = 2
http://www.businessinsider.com/the-17-equations-that-changed-the-world-2012-7#eulers-formula-for-polyhedra-6

SET @V = 4; # Vertices
SET @E = 6; # Edges
SET @F = 4; # Faces
SELECT @V - @E + @F as Tetrahedron;

SET @V = 8; # Vertices
SET @E = 12; # Edges
SET @F = 6; # Faces
SELECT @V - @E + @F as Hexahedron;

SET @V = 12; # Vertices
SET @E = 30; # Edges
SET @F = 20; # Faces
SELECT @V - @E + @F as Icosahedron;

SET @V = 12; # Vertices
SET @E = 30; # Edges
SET @F = 20; # Faces
SELECT @V - @E + @F as Icosahedron;

  • सापेक्षता ई के आइंस्टीन के सिद्धांत = एम सी ^ 2

SET @lbs = 190; # lbs
SET @lb2gram = 453.6; # 1 lbs = 453.6g
SET @lbstograms := @lbs * @lb2gram / 1;
SET @m := @lbstograms * 1 / 1000;
SET @c := POW(3.00 * POW(10,8), 2 );
SELECT @E := @m * @c ;
+----------------+
| @E := @m * @c |
+----------------+
| 7.75656e18 |
+----------------+

  • 1 = 0.9999 .....

SELECT SUM(.9/(9/10));
+----------------+
| SUM(.9/(9/10)) |
+----------------+
| 1.00000 |
+----------------+

Saturday, July 25, 2015

MySQL के साथ त्वरित पासवर्ड पीढ़ी

Original post http://anothermysqldba.blogspot.com/2015/07/quick-password-generation-with-mysql.html

यहाँ MySQL का उपयोग कर एक पासवर्ड आपके आवेदन को उत्पन्न करने के लिए एक त्वरित और आसान तरीका है। 
यह प्रश्न एक ऊपरी और निचले मामले की लंबाई और मूल्यों में बेतरतीब ढंग से उत्पन्न पासवर्ड बनाएगा। 


SELECT CONCAT(UCASE(SUBSTRING( SUBSTRING(MD5(RAND()), FLOOR( 1 + (RAND() * 5)) , FLOOR( 8 + (RAND() * 15 )) ) , FLOOR( 1 + (RAND() * 4 )) , FLOOR( 4 + (RAND() * 12 )) )), 
SUBSTRING('!@#$%^&*', FLOOR( 1 + (RAND() * 4)) , FLOOR( 1 + (RAND() * 8)) ), 
SUBSTRING( SUBSTRING(MD5(RAND()), FLOOR( 1 + (RAND() * 5)) , FLOOR( 8 + (RAND() * 15 )) ) , 5)) as password \G 


तो दूसरी छमाही में यह एमडी 5 कि स्वचालित रूप से करता है क्योंकि शेष निचले मामले में है तो कुछ प्रतीकों कहते हैं जब लागू इस क्वेरी गतिशील पासवर्ड के 1 हिस्सा है और ऊपरी मामले में इसके लिए एक यादृच्छिक मान ले जाएगा। आप निश्चित रूप से आप पसंद करेंगे जो कुछ प्रतीकों को समायोजित कर सकते हैं। 

परिणामों का उदाहरण: 

CREATE TABLE `generated` ( 
`password` varchar(255) NOT NULL 
) ENGINE=InnoDB ; 

MariaDB [(none)]> INSERT INTO test.generated SELECT CONCAT(UCASE(SUBSTRING( SUBSTRING(MD5(RAND()), FLOOR( 1 + (RAND() * 5)) , FLOOR( 8 + (RAND() * 15 )) ) , FLOOR( 1 + (RAND() * 4 )) , FLOOR( 4 + (RAND() * 12 )) )), SUBSTRING('!@#$%^&*', FLOOR( 1 + (RAND() * 4)) , FLOOR( 1 + (RAND() * 8)) ),SUBSTRING( SUBSTRING(MD5(RAND()), FLOOR( 1 + (RAND() * 5)) , FLOOR( 8 + (RAND() * 15 )) ) , 5)) as password; 

MariaDB [(none)]> select * from test.generated; 
+-----------------------------------+ 
| password | 
+-----------------------------------+ 
| 7232E1D9$%^&*f7de22c1b14f15c8a6 | 
| DEE22B7F7#$%541adcdd1b8e2 | 
| 2C4BB81001@#$%^&d0d9a2126 | 
| 941D3B92D@#$%^a4b7be92 | 
| 1CF2563254FC@#a79bb5 | 
| 2AE86E7D6!@#$%^&*4ca03f2e8 | 
| 074DD8D3#$e70a1 | 
| B2DDC!@#$%^47a252f79 | 
| 3A6D0A#$%^&*01ce9278a2a | 
| E9FB4CD16E19!739db9faa1616505c | 
| 1ED7A2E1379B4!@#$%ebe60b | 
| E9B57D71DB1@#$%^e9a4f8c2e94bf3d35 | 
| C97982!@#$8b5c534653c06 | 
| DE8998057C8!@#$%^8977a807 | 
| 7C7172EB1AE5$%^&*79d2b27 | 
| B52CE71@#$%^&*4508 | 
| AB17714F!@#$%^&203ba4ff80f8a6 | 
| 558D@#$04087871e29ff54 | 
| 27A78E8EF#$%^b8cee8628d81593 | 
| 315F2EC4#ad9913ec0595c | 
+-----------------------------------+
 

Sunday, June 28, 2015

फाइबोनैचि अनुक्रम प्रक्रिया

Original post: http://anothermysqldba.blogspot.com/2015/06/fibonacci-sequence-procedure.html

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

अब इस पद पहले से ही अस्तित्व में है: 

इसलिए मुझे लगता है कि पद संभाल लिया है और एक छोटे से इस पर विस्तार किया है, परिणाम है कि आप कॉल करते हैं और आप के बाद कर रहे हैं कि फाइबोनैचि अनुक्रम भीतर रेंज वापसी कर सकते हैं कि एक प्रक्रिया है। 

प्रक्रिया में नीचे है: 

delimiter // 
CREATE PROCEDURE `Fibonacci`(IN POS INT, IN RANG INT, IN LIMTED INT) 
BEGIN 
select FORMAT(Fibonacci,0) AS Fibonacci from ( 
select @f0 Fibonacci, @fn:=@f1+@f0, @f0:=@f1, @f1:=@fn 
from (select @f0:=0, @f1:=1, @fn:=1) x, 
information_schema.STATISTICS p limit LIMTED) y LIMIT POS, RANG; 
END// 
delimiter ; 


आप इस कॉल और जो कुछ मूल्यों के पास है और आप के बाद कर रहे पर्वतमाला कर सकते हैं। 

आप 5 वीं मूल्य चाहते हैं, तो अनुक्रम और अगले मूल्य में (0 से शुरू) 

> CALL Fibonacci(5,2,100); 
+-----------+ 
| Fibonacci | 
+-----------+ 
| 5 | 
| 8 | 
+-----------+ 


आप 30 वीं मूल्य चाहते हैं, तो अनुक्रम और अगले मूल्य में (0 से शुरू) 

> CALL Fibonacci(30,2,100); 
+-----------+ 
| Fibonacci | 
+-----------+ 
| 832,040 | 
| 1,346,269 | 
+-----------+ 


आप 150 वीं मूल्य चाहते हैं, तो अनुक्रम और अगले मूल्य में (0 से शुरू) 

> CALL Fibonacci(150,2,1000); 
+--------------------------------------------+ 
| Fibonacci | 
+--------------------------------------------+ 
| 9,969,216,677,189,305,000,000,000,000,000 | 
| 16,130,531,424,904,583,000,000,000,000,000 | 
+--------------------------------------------+ 


तो तुम यह विचार मिलता है। आप 2 बस प्रक्रिया कॉल में 2 मूल्य बदलने से भी अधिक चाहते हैं, तो अब आप भी परिणामों की रेंज का विस्तार कर सकते हैं। 

> CALL Fibonacci(0,10,100); 
+-----------+ 
| Fibonacci | 
+-----------+ 
| 0 | 
| 1 | 
| 1 | 
| 2 | 
| 3 | 
| 5 | 
| 8 | 
| 13 | 
| 21 | 
| 34 | 
+-----------+ 

> CALL Fibonacci(30,5,100); 
+-----------+ 
| Fibonacci | 
+-----------+ 
| 832,040 | 
| 1,346,269 | 
| 2,178,309 | 
| 3,524,578 | 
| 5,702,887 | 
+-----------+ 


वैसे भी, किसी के मूल पोस्ट करने के लिए जाना है क्वेरी के आधार के लिए यह उपयोगी और क्रेडिट पाता है उम्मीद है।

Friday, December 26, 2014

/ लगाएं एक स्ट्रिंग के भीतर से एक स्ट्रिंग पार्स

Original post: http://anothermysqldba.blogspot.com/2014/12/findparse-string-from-within-string.html

तो मैंने हाल ही में एक और स्ट्रिंग के बाहर एक स्ट्रिंग पार्स करने के बारे में कुछ अलग सवाल और पदों देखा। कुछ समाधान आदि नए कार्य और बनाने शामिल है, जबकि यह भी है कि कुछ मामलों में एक ही प्रश्न के भीतर किया जा सकता है। 

उदाहरण के लिए, हमें हम एक यूआरएल से डोमेन बाहर खींचने के लिए देख रहे हैं कि हम कहते हैं। मैं करने के लिए क्यों और कैसे यह काम करता है के रूप में विस्तार में जाने की कोशिश करेंगे। 
हम निम्न तालिका है। 

CREATE TABLE `parse_example` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`urldemo` varchar(150) NOT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 
+----+----------------------------+ 
| id | urldemo | 
+----+----------------------------+ 
| 1 | http://www.mysql.com/ | 
| 2 | http://www.percona.com/ | 
| 3 | https://tools.percona.com/ | 
| 4 | https://mariadb.com/ | 
| 5 | http://planet.mysql.com/ | 
| 6 | http://dev.mysql.com/doc/ | 
+----+----------------------------+ 


कॉम के बाद // और कुछ भी: // या https: इस उदाहरण के लिए लक्ष्य HTTP उपेक्षा करने के लिए है। इसलिए हम स्थानों को खोजने के लिए खोजें उपयोग करें। 

कॉम संदर्भ हम उस के साथ शुरू कर सकते हैं इतना है कि स्थिर है के बाद से आसान है। 

SELECT LOCATE('.com', urldemo), urldemo FROM parse_example; 
+-------------------------+----------------------------+ 
| LOCATE('.com', urldemo) | urldemo | 
+-------------------------+----------------------------+ 
| 17 | http://www.mysql.com/ | 
| 19 | http://www.percona.com/ | 
| 22 | https://tools.percona.com/ | 
| 16 | https://mariadb.com/ | 
| 20 | http://planet.mysql.com/ | 
| 17 | http://dev.mysql.com/doc/ | 
+-------------------------+----------------------------+ 


ठीक है तो हम / निकालना चाहते हैं, कि क्या स्थान है? 

SELECT LOCATE('.com', urldemo) as start, LOCATE('.com', urldemo) +4 as end, SUBSTRING(urldemo FROM LOCATE('.com', urldemo) + 4 ) AS resulting , urldemo FROM parse_example; 
+-------+-----+-----------+----------------------------+ 
| start | end | resulting | urldemo | 
+-------+-----+-----------+----------------------------+ 
| 17 | 21 | / | http://www.mysql.com/ | 
| 19 | 23 | / | http://www.percona.com/ | 
| 22 | 26 | / | https://tools.percona.com/ | 
| 16 | 20 | / | https://mariadb.com/ | 
| 20 | 24 | / | http://planet.mysql.com/ | 
| 17 | 21 | /doc/ | http://dev.mysql.com/doc/ | 
+-------+-----+-----------+----------------------------+

यह मैं ही पालन करने के लिए परिणामों को आसान बनाने के लिए क्षेत्र उपनाम रखा है, हमें हमारे अंत की स्थिति देता है। 

उन्हें बाद //, तो हम सिर्फ स्ट्रिंग में / दूसरे के स्थान की जरूरत: अब HTTP और HTTPS के बाद बाहर छँटाई बहुत आसान के रूप में अच्छी तरह से वे दोनों के रूप में वास्तव में है। 


SELECT LOCATE('/', urldemo) as first, LOCATE('/', urldemo) +1 as second, urldemo 
FROM parse_example; 
+-------+--------+----------------------------+ 
| first | second | urldemo | 
+-------+--------+----------------------------+ 
| 6 | 7 | http://www.mysql.com/ | 
| 6 | 7 | http://www.percona.com/ | 
| 7 | 8 | https://tools.percona.com/ | 
| 7 | 8 | https://mariadb.com/ | 
| 6 | 7 | http://planet.mysql.com/ | 
| 6 | 7 | http://dev.mysql.com/doc/ | 
+-------+--------+----------------------------+ 


इन प्रश्नों सिर्फ अंतिम क्वेरी के विभिन्न पहलुओं कर रही हो जाएगा क्या दिखा रहे हैं। इसलिए हमें यह सब एक साथ डाल दिया। 


SELECT 
TRIM(TRAILING SUBSTRING(urldemo FROM LOCATE('.com', urldemo) + 4 ) 
FROM SUBSTRING(urldemo FROM LOCATE('/', urldemo) + 2 ) ) AS parsed_domain , 
urldemo as original_url 
FROM parse_example; 
+-------------------+----------------------------+ 
| parsed_domain | original_url | 
+-------------------+----------------------------+ 
| www.mysql.com | http://www.mysql.com/ | 
| www.percona.com | http://www.percona.com/ | 
| tools.percona.com | https://tools.percona.com/ | 
| mariadb.com | https://mariadb.com/ | 
| planet.mysql.com | http://planet.mysql.com/ | 
| dev.mysql.com | http://dev.mysql.com/doc/ | 
+-------------------+----------------------------+ 


अब उम्मीद है कि आप की जरूरत है जो कुछ भी बाहर पार्स करने में सक्षम हो मदद करता है। यह उदाहरण एक यूआरएल तक सीमित है। लेकिन कार्य के कुछ उदाहरण के बाद से पहले से ही यहाँ आप की जरूरत है जो कुछ पार्स करने के लिए उपयोग कर सकते हैं कि एक समारोह के मेरे उदाहरण है। 



CREATE FUNCTION PARSE_STRING(delimiterA VARCHAR(50), delimiterB VARCHAR(50), passed_string VARCHAR(255) ) 
RETURNS VARCHAR(255) DETERMINISTIC 
RETURN 
TRIM(TRAILING SUBSTRING(passed_string FROM LOCATE(delimiterB, passed_string) ) 
FROM SUBSTRING(passed_string FROM LOCATE(delimiterA, passed_string) + CHAR_LENGTH(delimiterA) ) ) ; 

SELECT PARSE_STRING('//','.com', urldemo) FROM parse_example; 
+------------------------------------+ 
| PARSE_STRING('//','.com', urldemo) | 
+------------------------------------+ 
| www.mysql | 
| www.percona | 
| tools.percona | 
| mariadb | 
| planet.mysql | 
| dev.mysql | 
+------------------------------------+ 


एक पूरा नाम क्षेत्र से एक अंतिम नाम खींचो: 

SELECT PARSE_STRING('John ','', 'John Smith') ; 
+----------------------------------------+ 
| PARSE_STRING('John ','', 'John Smith') | 
+----------------------------------------+ 
| Smith | 
+----------------------------------------+ 


पहला नाम खींचो 

SELECT PARSE_STRING('',' Smith', 'John Smith') ; 
+-----------------------------------------+ 
| PARSE_STRING('',' Smith', 'John Smith') | 
+-----------------------------------------+ 
| John | 
+-----------------------------------------+ 


नाम उदाहरणों के साथ दी जाती है कि आप सीमांकक मूल्यों को पता करने की आवश्यकता होगी। लेकिन यह आप पर निर्माण कर सकते हैं सिर्फ एक उदाहरण है।

Thursday, December 18, 2014

एक MySQL विभाजन और SUBPARTITION उदाहरण

Original post: http://anothermysqldba.blogspot.com/2014/12/a-mysql-partition-and-subpartition.html

तो यह एक विभाजन और MySQL में एक SUBPARTITION कैसे स्थापित करने के लिए सिर्फ एक सरल उदाहरण है। यहाँ अवधारणा आप एक datetime क्षेत्र में कई मूल्यों के साथ एक तालिका में डेटा है। आप (यदि आप करते हैं सबसे अधिक संभावना) कई साल भर में फैला हुआ है कि डेटा हो सकता है। इसलिए इस डेटा विभाजन करने के लिए एक ही रास्ता वर्ष से इसे तरह है, लेकिन फिर भी लगता है कि वार्षिक विभाजन के भीतर माह से यह सॉर्ट करने के लिए है। 

नीचे आप विचार के लिए उपयोग कर सकते हैं कि एक उदाहरण है। 

परीक्षण मेज पर विचार करें। के साथ अपनी मेज पाठ्यक्रम के कई क्षेत्रों है। 

CREATE TABLE `t1` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`date_time` datetime DEFAULT NOW(), 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB; 


पहले मैं DATE_TIME क्षेत्र के लिए यादृच्छिक मूल्यों के साथ परीक्षण तालिका आबाद होगा। 

delimiter // 
CREATE PROCEDURE populate_t1( IN rowsofdata INT ) 
BEGIN 

SET @A = 1; 
SET @B = 25 - @A; 

WHILE rowsofdata > 0 DO 
SELECT FLOOR( @A + (RAND() * @B )) INTO @randvalue; 
INSERT INTO t1 
SELECT NULL, NOW() - INTERVAL @randvalue MONTH; 
SET rowsofdata = rowsofdata - 1; 
END WHILE; 
END// 
delimiter ; 
call populate_t1(1000); 


मैं के साथ समाप्त हुआ मूल्यों का किस तरह देखने के लिए जाँच करें: 

> SELECT COUNT(*) FROM t1 WHERE date_time BETWEEN '2012-01-01 00:00:00' AND '2013-01-01 00:00:00'\G 
*************************** 1. row *************************** 
COUNT(*): 43 
1 row in set (0.00 sec) 

> SELECT COUNT(*) FROM t1 WHERE date_time BETWEEN '2013-01-01 00:00:00' AND '2014-01-01 00:00:00'\G 
*************************** 1. row *************************** 
COUNT(*): 529 
1 row in set (0.00 sec) 

> SELECT COUNT(*) FROM t1 WHERE date_time BETWEEN '2014-01-01 00:00:00' AND NOW() \G
*************************** 1. row *************************** 
COUNT(*): 428 
1 row in set (0.00 sec) 


मैं विभाजन के माध्यम से मूल्यों मायने रखता है मेरी विभाजन जोड़ने और फिर परीक्षण कर सकते हैं तो अब मैं टेबल बदल सकते हैं। 

ALTER TABLE t1 DROP PRIMARY KEY, ADD PRIMARY KEY (`id`,`date_time`), LOCK=SHARED; 
ALTER TABLE t1 
PARTITION BY RANGE( YEAR(date_time) ) 
SUBPARTITION BY HASH(MONTH(date_time) ) ( 

PARTITION p2012 VALUES LESS THAN (2013) ( 
SUBPARTITION dec_2012, 
SUBPARTITION jan_2012, 
SUBPARTITION feb_2012, 
SUBPARTITION mar_2012, 
SUBPARTITION apr_2012, 
SUBPARTITION may_2012, 
SUBPARTITION jun_2012, 
SUBPARTITION jul_2012, 
SUBPARTITION aug_2012, 
SUBPARTITION sep_2012, 
SUBPARTITION oct_2012, 
SUBPARTITION nov_2012 
), 

PARTITION p2013 VALUES LESS THAN (2014) ( 
SUBPARTITION dec_2013, 
SUBPARTITION jan_2013, 
SUBPARTITION feb_2013, 
SUBPARTITION mar_2013, 
SUBPARTITION apr_2013, 
SUBPARTITION may_2013, 
SUBPARTITION jun_2013, 
SUBPARTITION jul_2013, 
SUBPARTITION aug_2013, 
SUBPARTITION sep_2013, 
SUBPARTITION oct_2013, 
SUBPARTITION nov_2013 

), 
PARTITION p2014 VALUES LESS THAN (2015) ( 
SUBPARTITION dec_2014, 
SUBPARTITION jan_2014, 
SUBPARTITION feb_2014, 
SUBPARTITION mar_2014, 
SUBPARTITION apr_2014, 
SUBPARTITION may_2014, 
SUBPARTITION jun_2014, 
SUBPARTITION jul_2014, 
SUBPARTITION aug_2014, 
SUBPARTITION sep_2014, 
SUBPARTITION oct_2014, 
SUBPARTITION nov_2014 
), 

PARTITION pmax VALUES LESS THAN MAXVALUE ( 
SUBPARTITION dec_max, 
SUBPARTITION jan_max, 
SUBPARTITION feb_max, 
SUBPARTITION mar_max, 
SUBPARTITION apr_max, 
SUBPARTITION may_max, 
SUBPARTITION jun_max, 
SUBPARTITION jul_max, 
SUBPARTITION aug_max, 
SUBPARTITION sep_max, 
SUBPARTITION oct_max, 
SUBPARTITION nov_max 
) 
); 


तालिका बनाने के अपने शो अब बहुत अलग है। 

> show create table t1; 
CREATE TABLE `t1` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`date_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP, 
PRIMARY KEY (`id`,`date_time`) 
) ENGINE=InnoDB AUTO_INCREMENT=1001 DEFAULT CHARSET=latin1 
/*!50100 PARTITION BY RANGE ( YEAR(date_time)) 
SUBPARTITION BY HASH (MONTH(date_time)) 
(PARTITION p2012 VALUES LESS THAN (2013) 
(SUBPARTITION dec_2012 ENGINE = InnoDB, 
SUBPARTITION jan_2012 ENGINE = InnoDB, 
SUBPARTITION feb_2012 ENGINE = InnoDB, 
SUBPARTITION mar_2012 ENGINE = InnoDB, 
SUBPARTITION apr_2012 ENGINE = InnoDB, 
SUBPARTITION may_2012 ENGINE = InnoDB, 
SUBPARTITION jun_2012 ENGINE = InnoDB, 
SUBPARTITION jul_2012 ENGINE = InnoDB, 
SUBPARTITION aug_2012 ENGINE = InnoDB, 
SUBPARTITION sep_2012 ENGINE = InnoDB, 
SUBPARTITION oct_2012 ENGINE = InnoDB, 
SUBPARTITION nov_2012 ENGINE = InnoDB), 
PARTITION p2013 VALUES LESS THAN (2014) 
(SUBPARTITION dec_2013 ENGINE = InnoDB, 
SUBPARTITION jan_2013 ENGINE = InnoDB, 
SUBPARTITION feb_2013 ENGINE = InnoDB, 
SUBPARTITION mar_2013 ENGINE = InnoDB, 
SUBPARTITION apr_2013 ENGINE = InnoDB, 
SUBPARTITION may_2013 ENGINE = InnoDB, 
SUBPARTITION jun_2013 ENGINE = InnoDB, 
SUBPARTITION jul_2013 ENGINE = InnoDB, 
SUBPARTITION aug_2013 ENGINE = InnoDB, 
SUBPARTITION sep_2013 ENGINE = InnoDB, 
SUBPARTITION oct_2013 ENGINE = InnoDB, 
SUBPARTITION nov_2013 ENGINE = InnoDB), 
PARTITION p2014 VALUES LESS THAN (2015) 
(SUBPARTITION dec_2014 ENGINE = InnoDB, 
SUBPARTITION jan_2014 ENGINE = InnoDB, 
SUBPARTITION feb_2014 ENGINE = InnoDB, 
SUBPARTITION mar_2014 ENGINE = InnoDB, 
SUBPARTITION apr_2014 ENGINE = InnoDB, 
SUBPARTITION may_2014 ENGINE = InnoDB, 
SUBPARTITION jun_2014 ENGINE = InnoDB, 
SUBPARTITION jul_2014 ENGINE = InnoDB, 
SUBPARTITION aug_2014 ENGINE = InnoDB, 
SUBPARTITION sep_2014 ENGINE = InnoDB, 
SUBPARTITION oct_2014 ENGINE = InnoDB, 
SUBPARTITION nov_2014 ENGINE = InnoDB), 
PARTITION pmax VALUES LESS THAN MAXVALUE 
(SUBPARTITION dec_max ENGINE = InnoDB, 
SUBPARTITION jan_max ENGINE = InnoDB, 
SUBPARTITION feb_max ENGINE = InnoDB, 
SUBPARTITION mar_max ENGINE = InnoDB, 
SUBPARTITION apr_max ENGINE = InnoDB, 
SUBPARTITION may_max ENGINE = InnoDB, 
SUBPARTITION jun_max ENGINE = InnoDB, 
SUBPARTITION jul_max ENGINE = InnoDB, 
SUBPARTITION aug_max ENGINE = InnoDB, 
SUBPARTITION sep_max ENGINE = InnoDB, 
SUBPARTITION oct_max ENGINE = InnoDB, 
SUBPARTITION nov_max ENGINE = InnoDB)) 


उम्मीद के रूप में तो हम अभी भी हमारे मूल्य भरोसा कर सकते हैं? 

> SELECT count(*) FROM t1 PARTITION (p2012) \G 
*************************** 1. row *************************** 
count(*): 43 
> SELECT count(*) FROM t1 PARTITION (p2013) \G 
*************************** 1. row *************************** 
count(*): 529 
> SELECT count(*) FROM t1 PARTITION (p2014) \G 
*************************** 1. row *************************** 
count(*): 428 


अब तक तो अच्छा, सभी मानों हम पहले था गणना करने के लिए मिलान। इसलिए हम भी गिनती या subpartition प्रति चुन सकते हैं। 


> SELECT * FROM t1 PARTITION (dec_2012) limit 5; 
+-----+---------------------+ 
| id | date_time | 
+-----+---------------------+ 
| 59 | 2012-12-19 00:59:57 | 
| 68 | 2012-12-19 00:59:58 | 
| 93 | 2012-12-19 00:59:59 | 
| 105 | 2012-12-19 00:59:59 | 
| 111 | 2012-12-19 00:59:59 | 
+-----+---------------------+ 

> SELECT * FROM t1 PARTITION (jan_2013) limit 5; 
+-----+---------------------+ 
| id | date_time | 
+-----+---------------------+ 
| 6 | 2013-01-19 00:59:55 | 
| 29 | 2013-01-19 00:59:56 | 
| 55 | 2013-01-19 00:59:57 | 
| 79 | 2013-01-19 00:59:58 | 
| 100 | 2013-01-19 00:59:59 | 
+-----+---------------------+ 

> SELECT * FROM t1 PARTITION (jan_2014) limit 5; 
+-----+---------------------+ 
| id | date_time | 
+-----+---------------------+ 
| 16 | 2014-01-19 00:59:55 | 
| 190 | 2014-01-19 01:00:04 | 
| 191 | 2014-01-19 01:00:04 | 
| 229 | 2014-01-19 01:00:05 | 
| 234 | 2014-01-19 01:00:06 | 
+-----+---------------------+ 

> SELECT * FROM t1 PARTITION (jun_2014) limit 5; 
+-----+---------------------+ 
| id | date_time | 
+-----+---------------------+ 
| 13 | 2014-06-19 00:59:55 | 
| 189 | 2014-06-19 01:00:04 | 
| 221 | 2014-06-19 01:00:05 | 
| 222 | 2014-06-19 01:00:05 | 
| 238 | 2014-06-19 01:00:06 | 
+-----+---------------------+ 

> SELECT * FROM t1 PARTITION (dec_2013) limit 5; 
+-----+---------------------+ 
| id | date_time | 
+-----+---------------------+ 
| 50 | 2013-12-19 00:59:57 | 
| 74 | 2013-12-19 00:59:58 | 
| 98 | 2013-12-19 00:59:59 | 
| 107 | 2013-12-19 00:59:59 | 
| 167 | 2013-12-19 01:00:02 | 
+-----+---------------------+ 


इस महान और आसान है लेकिन वर्ष 2015 या 2016 के आसपास आता है तो क्या होगा? उस डेटा के सभी pmax विभाजन में होगा। तो कैसे हम p2014 और pmax के बीच में एक नया विभाजन जोड़ सकता हूँ? 

आप pmax में कोई डाटा नहीं था, तो आप इसे छोड़ देता है और अंत पर एक नया विभाजन जोड़ सकता है। लेकिन यह विभाजन के पुनर्निर्माण के लिए बस के रूप में आसान है। इस pmax विभाजन लेने के लिए और हमारे नए विभाजन में बदल जाएगा। 


ALTER TABLE t1 REORGANIZE PARTITION pmax INTO ( 
PARTITION p2015 VALUES LESS THAN (2016) ( 
SUBPARTITION dec_2015, 
SUBPARTITION jan_2015, 
SUBPARTITION feb_2015, 
SUBPARTITION mar_2015, 
SUBPARTITION apr_2015, 
SUBPARTITION may_2015, 
SUBPARTITION jun_2015, 
SUBPARTITION jul_2015, 
SUBPARTITION aug_2015, 
SUBPARTITION sep_2015, 
SUBPARTITION oct_2015, 
SUBPARTITION nov_2015 
), 
PARTITION pmax VALUES LESS THAN MAXVALUE ( 
SUBPARTITION dec_max, 
SUBPARTITION jan_max, 
SUBPARTITION feb_max, 
SUBPARTITION mar_max, 
SUBPARTITION apr_max, 
SUBPARTITION may_max, 
SUBPARTITION jun_max, 
SUBPARTITION jul_max, 
SUBPARTITION aug_max, 
SUBPARTITION sep_max, 
SUBPARTITION oct_max, 
SUBPARTITION nov_max 
) 
); 


यह भाग्य का सबसे अच्छा मदद करता है उम्मीद।