Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1101322
  • 博文数量: 170
  • 博客积分: 1603
  • 博客等级: 上尉
  • 技术积分: 1897
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-09 15:54
文章分类

全部博文(170)

文章存档

2016年(27)

2015年(21)

2014年(27)

2013年(21)

2012年(7)

2011年(67)

我的朋友

分类: Mysql/postgreSQL

2014-03-23 13:49:51

DAY()
DAYOFMONTH()
DAYOFWEEK()
DAYOFYEAR()
DATEDIFF()
EXTRACT()
HOUR()
MICROSECOND()
MINUTE()
MOD()
MONTH()
QUARTER()
SECOND()
TIME_TO_SEC()
TO_DAYS()
WEEKDAY()
YEAR()
YEARWEEK() 等
当然,还有FLOOR(),CEILING() 等,前提是使用这两个分区函数的分区健必须是整型。


按星期分区的表  WEEKDAY从0开始
CREATE TABLE `bage_visitlist` (
  `ipaddress` varchar(16) NOT NULL DEFAULT '',
  `visitfrom` varchar(16) NOT NULL DEFAULT '',
  `visittimes` int(10) unsigned NOT NULL DEFAULT '0',
  `visittime` datetime NOT NULL DEFAULT '2013-01-01 00:00:00',
  `deviceype` varchar(16) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=utf8
PARTITION BY LIST (WEEKDAY(visittime))
(PARTITION d1 VALUES IN (0) ENGINE = MyISAM,
 PARTITION d2 VALUES IN (1) ENGINE = MyISAM,
 PARTITION d3 VALUES IN (2) ENGINE = MyISAM,
 PARTITION d4 VALUES IN (3) ENGINE = MyISAM,
 PARTITION d5 VALUES IN (4) ENGINE = MyISAM,
 PARTITION d6 VALUES IN (5) ENGINE = MyISAM,
 PARTITION d7 VALUES IN (6) ENGINE = MyISAM) ;

 d1-d7有需要可以换成各个星期的缩写
星期一 MON
星期二 TUE
星期三 WED
星期四 THU
星期五 FRI
星期六 SAT
星期天 SUN


测试发现,分区插入是分区的,但是EXPLAIN  PARTITIONS跟踪发现都是全区扫描的,条件里加入WEEKDAY(visittime)这样的也不行

但是如果你插入的datetime字段是不带时间只有日期的话,where条件里没出现函数只用=来判断日期,是可以分区搜索的

分区应该和索引一样,一但where中出现函数,就会全区扫描
下面的表PARTITION BY LIST (month(create_time)),Explain结果不太乐观
mysql> Explain partitions select * from rec_pay where create_time = '2014-06-01 00:00:00' limit 20; 
+----+-------------+---------+------------+------+---------------+------+---------+------+--------+-------------+
| id | select_type | table   | partitions | type | possible_keys | key  | key_len | ref  | rows   | Extra       |
+----+-------------+---------+------------+------+---------------+------+---------+------+--------+-------------+
|  1 | SIMPLE      | rec_pay | p6         | ALL  | NULL          | NULL | NULL    | NULL | 176370 | Using where |
+----+-------------+---------+------------+------+---------------+------+---------+------+--------+-------------+

mysql> Explain partitions select * from rec_pay where create_time < '2014-05-01 00:00:00' and create_time > '2014-04-03 00:00:00' limit 20;  
+----+-------------+---------+-------------------------------------------+------+---------------+------+---------+------+---------+-------------+
| id | select_type | table   | partitions                                | type | possible_keys | key  | key_len | ref  | rows    | Extra       |
+----+-------------+---------+-------------------------------------------+------+---------------+------+---------+------+---------+-------------+
|  1 | SIMPLE      | rec_pay | p0,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12 | ALL  | NULL          | NULL | NULL    | NULL | 2517770 | Using where |
+----+-------------+---------+-------------------------------------------+------+---------------+------+---------+------+---------+-------------+

各个分区行数查询
SELECT table_name,partition_name,table_rows FROM information_schema.PARTITIONS  WHERE  table_schema=database() AND table_name='table_name'

mysql explain字段说明

点击(此处)折叠或打开

  1. EXPLAIN字段:
  2. 1 Table:显示这一行的数据是关于哪张表的
  3. 2 possible_keys:显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句
  4. 3 key:实际使用的索引。如果为NULL,则没有使用索引。MYSQL很少会选择优化不足的索引,此时可以在SELECT语句中使用USE INDEX(index)来强制使用一个索引或者用IGNORE INDEX(index)来强制忽略索引
  5. 4 key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好
  6. 5 ref:显示索引的哪一列被使用了,如果可能的话,是一个常数
  7. 6 rows:MySQL认为必须检索的用来返回请求数据的行数
  8. 7 type:这是最重要的字段之一,显示查询使用了何种类型。从最好到最差的连接类型为system、const、eq_reg、ref、range、index和ALL
  9. system、const:可以将查询的变量转为常量. 如id=1; id为 主键或唯一键.
  10. eq_ref:访问索引,返回某单一行的数据.(通常在联接时出现,查询使用的索引为主键或惟一键)
  11. ref:访问索引,返回某个值的数据.(可以返回多行) 通常使用=时发生
  12. range:这个连接类型使用索引返回一个范围中的行,比如使用>或<查找东西,并且该字段上建有索引时发生的情况(注:不一定好于index)
  13. index:以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描
  14. ALL:全表扫描,应该尽量避免
  15. 8 Extra:关于MYSQL如何解析查询的额外信息,主要有以下几种
  16. using index:只用到索引,可以避免访问表.
  17. using where:使用到where来过虑数据. 不是所有的where clause都要显示using where. 如以=方式访问索引.
  18. using tmporary:用到临时表
  19. using filesort:用到额外的排序. (当使用order by v1,而没用到索引时,就会使用额外的排序)
  20. range checked for eache record(index map:N):没有好的索引.

阅读(3022) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~