关于MySQL数据量的疑惑

水平凡 发布于 2016/10/08 16:13
阅读 511
收藏 0

表结构如下:

CREATE TABLE `order` (
  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `sites_id` tinyint(4) NOT NULL DEFAULT '0' COMMENT '站点ID',
  `parentid` int(11) NOT NULL DEFAULT '0' COMMENT '父订单id',
  `order_id` int(11) NOT NULL DEFAULT '0' COMMENT '关联主键,订单ID',
  `order_sn` char(30) NOT NULL DEFAULT '' COMMENT '订单编号',
  `spread` varchar(100) NOT NULL DEFAULT '' COMMENT '推广来源',
  `order_title` varchar(255) NOT NULL DEFAULT '' COMMENT '订单标题',
  `servers_id` tinyint(4) NOT NULL DEFAULT '0' COMMENT '服务应用ID',
  `money` float(10,2) NOT NULL DEFAULT '0.00' COMMENT '需要支付金额',
  `status` tinyint(1) NOT NULL DEFAULT '0' COMMENT '订单状态,0未支付,1已经完成',
  `platform` tinyint(2) NOT NULL DEFAULT '0' COMMENT '来源平台,0未知,1电脑,2手机,3App,4微信客户端',
  `username` varchar(255) NOT NULL DEFAULT '' COMMENT '用户名',
  `gender` tinyint(1) NOT NULL DEFAULT '0' COMMENT '0未填写,1是男,2是女',
  `email` varchar(255) NOT NULL DEFAULT '' COMMENT '用户邮箱',
  `birthday` int(10) NOT NULL DEFAULT '0' COMMENT '出身年月日,时间戳',
  `user_spread` text NOT NULL COMMENT '用户扩展信息,json',
  `report` mediumtext NOT NULL COMMENT '测算报告',
  `info` text NOT NULL COMMENT '订单扩展信息',
  `ip` varchar(20) NOT NULL DEFAULT '' COMMENT '下单用户提交ip',
  `email_notice` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否进行邮件通知',
  `update_time` int(10) NOT NULL DEFAULT '0' COMMENT '最后修改时间',
  `create_time` int(10) NOT NULL DEFAULT '0' COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `order_sn` (`order_sn`),
  KEY `email` (`email`),
  KEY `create_time` (`create_time`),
  KEY `spread` (`spread`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='订单列表'

我使用count(*)得到的数据量是:

SELECT COUNT(*)  FROM `order`; 结果是 

403727
用阿里云的表数据量统计 这个表,行数是 3536005 。。。

最新的自增长ID值为:902478 

然后我用 EXPLAIN  SELECT * FROM `order`  WHERE `sites_id` = 1 结果是:

1
id
1
long(3)
2
select_type
SIMPLE
varchar(19)
3
table
order
varchar(64)
4
type
ALL
varchar(10)
5
possible_keys
 
    
varchar(4096)
6
key
 
    
varchar(64)
7
key_len
 
    
varchar(4096)
8
ref
 
    
varchar(1024)
9
rows
3536017
long(10)
10
Extra
Using where
varchar(255)

比较疑惑的是 rows 为嘛那么大???

加载中
0
幻之羽翼
幻之羽翼

你主键的数量是 COUNT(*) 大约2倍,说明你每次操作订单有可能删除一次再创建一次。

rows这个数是count(*)的8倍

0
高山流水情
高山流水情
 `money` float(10,2),《高性能mysql》那本书上说,金额类的字段推荐使用decimal
MGL_TECH
MGL_TECH
是的我一律用decimal
水平凡
水平凡
好~
0
mickelfeng
mickelfeng
order 是关键字,表名最好不要用关键字
水平凡
水平凡
这个是故意替换的,实际上不是!
0
Nils张
Nils张

rows 字段是指mysql认为在查询中应该检索的记录数。

估算值

返回顶部
顶部