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を覚えておいてください)​​:A ^ 2 + B ^ 2 = C ^ 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 |
+-------------------------------------+


だから、Cを解決し、もちろんあなたにものために解決するためにこれを使用します。

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 |
+---------------------------------------+

  • 多面体のためのオイラーの公式:F - E + 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;

  • 相対性理論Eのアインシュタインの理論= MC ^ 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 |
+----------------+

Sunday, July 26, 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 


それは一部の記号を追加すると、適用後、後半このクエリでは、MD5は自動的にそれを行うために、残りは小文字である動的パスワードの最初の部分と上ケースそれのためのランダムな値になります。 もちろん、あなたが好むものは何でもシンボル調整することができます。 

結果の一例: 

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 | 
+-----------------------------------+
 

Monday, June 29, 2015

フィボナッチ数列手順

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

 私は、そのことについて申し訳ありません掲示ので、まあそれはしばらくしています。 今日、私はテレビ番組のフリンジの再放送を見ていたウォルターは、フィボナッチ数列を参照するとき、私は、このための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 | 
+-----------+ 


だから、配列および次の値に(0から始まる )150番目の値が必要な場合 

> 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 | 
+-----------+ 


とにかく、誰かがオリジナルのポストに行くんクエリのベースのため、それが役に立つとクレジット見つけたいと考えています

Saturday, December 27, 2014

文字列の中から文字列を解析/検索

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

だから私は最近、別の文字列から文字列を解析に関するいくつかの異なる質問や投稿に気づいた。 いくつかのソリューションは、新しい機能やなどの作成に含まれるものの、それはいくつかのケースでは、単一のクエリ内でもを行うことができます。 

たとえば、私たちはURLからドメインを引き出すために探しているとしましょう​​。 私はなぜ、どのようにこの作品を詳細に入るためにしようとします。 
我々は、次の表を持っている。 

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/ | 
+----+----------------------------+ 


.comの後に//と何も://またはhttps:この例の目標は、httpを無視することです。 だから我々は場所を見つけるためにLOCATE使用しています。 

.comの基準は、我々はそれに始めることができるので、それは一定であるので簡単です。 

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/ | 
+-------------------------+----------------------------+ 


[OK]をので、私たちは/を削除したい、それがどのような場所ですか? 

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/ | 
+-------------------+----------------------------+ 


今、うまくいけばそれはあなたが何が必要を解析することができるのに役立ちます。 この例では、URLに限られている。 しかし、すでにここの機能のいくつかの例以来、あなたは何が必要構文解析するために使用できる機能の私の例である。 



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 | 
+-----------------------------------------+ 


名の例で付与あなたは、区切りの値を知っている必要があります。 しかし、これはあなたが構築できるだけの例です。

Friday, December 19, 2014

MySQLのパーティションとSUBPARTITION例

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

だから、これはパーティションとMySQLでSUBPARTITIONを設定する方法の単純な例です。 ここにコンセプトを使用すると、日時フィールドで多数の値を持つテーブル内のデータを持っているということです。 あなたは(あなたが最も可能性が高い)、多くの年に分散しているデータがあるとします。 したがって、このデータを分割するための一つの方法は、年によってそれを並べ替えるが、その後もその毎年のパーティション内で、月によってそれをソートすることです。 

以下は、検討のために使用できる例です。 

テストテーブルを考えてみましょう。 もちろん、より多くのフィールドがあるとあなたのテーブル。 

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 


これまでのところは良い、すべての値が我々の前に持っていた数まで一致した。 だから我々はまた、カウントまたはサブパーティションごとに選択することができます。 


> 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 
) 
); 


これは、最高の幸運をお役に立てば幸いです。