2017-02-17 13 views
0

私はテーブル 'items'を持っています。 18万のレコードは:データごとの分割mysql

CREATE TABLE IF NOT EXISTS `part_items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `log_id` int(11) NOT NULL, 
    `res_id` int(11) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `title` text NOT NULL, 
    `content` text NOT NULL, 
    `n_date` varchar(255) NOT NULL, 
    `nd_date` int(11) NOT NULL, 
    `s_date` int(11) NOT NULL, 
    `not_date` date NOT NULL, 
    PRIMARY KEY (`not_date`,`id`), 
    UNIQUE KEY `link_2` (`not_date`,`link`), 
    KEY `log_id` (`log_id`), 
    KEY `res_id` (`res_id`), 
    KEY `now_date` (`not_date`), 
    KEY `sql_index` (`res_id`,`id`,`not_date`) 
) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 
/*!50100 PARTITION BY RANGE (TO_DAYS(not_date)) 
(PARTITION p_1 VALUES LESS THAN (735963) ENGINE = Aria, 
PARTITION p_2 VALUES LESS THAN (736694) ENGINE = Aria) */ AUTO_INCREMENT=18414661 ; 

は、その後、私はsql_query実行します。

CREATE TABLE IF NOT EXISTS `items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `log_id` int(11) NOT NULL, 
    `res_id` int(11) NOT NULL, 
    `link` varchar(255) NOT NULL, 
    `title` text NOT NULL, 
    `content` text NOT NULL, 
    `n_date` varchar(255) NOT NULL, 
    `nd_date` int(11) NOT NULL, 
    `s_date` int(11) NOT NULL, 
    `not_date` date NOT NULL, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `link_2` (`link`), 
    KEY `log_id` (`log_id`), 
    KEY `res_id` (`res_id`), 
    KEY `now_date` (`not_date`), 
    KEY `sql_index` (`res_id`,`id`,`not_date`) 
) ENGINE=Aria DEFAULT CHARSET=utf8 PAGE_CHECKSUM=0 AUTO_INCREMENT=18382133 ; 

は、私はそれのミニコピーを作成し、このテーブルを分割し、プライマリとuniqのキーで列「not_date」を含めるようにしよう

alter table `part_items` PARTITION BY RANGE(TO_DAYS(not_date)) (
PARTITION p_1 VALUES LESS THAN(TO_DAYS('2014-12-31')), 
PARTITION p_2 VALUES LESS THAN(TO_DAYS('2016-12-31')) 
); 

次に、p_1でなくてはならないレコードを選択しようとしていて、パーティションについて説明すると、p_1でしか検索できなかったことがわかります。しかし、p_2になければならないレコードを選択すると、説明パーティションはフルスキャン(p_1、p_2)を表示します。 私のコードで何が間違っていますか? クエリ:

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date < '2014-05-12' 

explain partitions SELECT * FROM `part_items` where content like '%k%' and not_date > '2015-01-01' 

そして、もう一つ質問:それはビューを分割することは可能ですか? enter image description here

+0

追加説明を出力してください – e4c5

+0

私は質問を編集して、出力を説明します – Baurzhan

+0

誰かが私を助けることができますか? – Baurzhan

答えて

0

PARTITIONing日付によって機能が無効になる可能性があります。それはNULLにつながります。そのような値はの最初のパーティションに格納されます。

これは多くの開発者を引きつけた問題です。典型的な「回避策」は、最初のパーティションを空にして、それを見る努力が(通常)最小限になるようにすることです。あなたの場合:

PARTITION p_0 VALUES LESS THAN(0) 

通常、約6パーティション未満でパーティション化するのは、あまり効果がありません。より多くのパーティションを追加しますか?

(警告:。。私のアドバイスは、MyISAMテーブル/ InnoDBの分割の年から来て、私はアリアの知らない動作が異なります、私はパーティショニングは、エンジンに依存しない層で処理ほとんどであると思われる)

+0

リックジェームス、非常にマッハーありがとう! PARTITION p_0の値を小さくする(0)本当に助けてください! – Baurzhan

関連する問題