zoukankan      html  css  js  c++  java
  • mysql优化之表建设

    就拿常见的用户表、文章类的表、日志表来分析如下
    CREATE TABLE `user` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT COMMENT 'user id',
      `name` varchar(255) NOT NULL COMMENT 'user name',
      `password` char(41) NOT NULL COMMENT 'user password',
      `email` varchar(64) NOT NULL COMMENT 'user email',
      `mobile` char(11) NOT NULL COMMENT 'user mobile phone',
      `remark` text COMMENT 'user remark',
      `subscribed` tinytext COMMENT '是否订阅稿件,针对实例',
      `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT 'user status(1:待审核,2:审核通过,3:驳回,4:预留状态,5:预留状态)',
      `is_super` tinyint(4) NOT NULL DEFAULT '0' COMMENT '用户权限:0:普通用户 1:超级管理员 2 普通管理员',
      `is_recommend` tinyint(1) NOT NULL DEFAULT '1' COMMENT '是否允许推荐[0:不允许1:允许]',
      `login_time` int(11) DEFAULT NULL COMMENT '最近一次登录时间',
      `login_cur` int(11) DEFAULT '0' COMMENT '当前登录时间',
      `create_time` int(11) NOT NULL COMMENT 'create time',
      `modify_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'last modify time',
      PRIMARY KEY (`id`),
      UNIQUE KEY `email` (`email`) USING BTREE,
      UNIQUE KEY `email_2` (`email`) USING BTREE
    ) ENGINE=InnoDB AUTO_INCREMENT=273 DEFAULT CHARSET=utf8 COMMENT='用户基本信息'
     
    CREATE TABLE `news` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `pid` mediumint(9) NOT NULL COMMENT '实例id',
      `catid` mediumint(10) NOT NULL DEFAULT '0' COMMENT '分类id',
      `module` char(5) NOT NULL DEFAULT 'text' COMMENT '稿件模型',
      `item_id` varchar(50) DEFAULT NULL COMMENT '文章id',
      `tag_id` varchar(10) DEFAULT NULL COMMENT '分类;news:闻 6_7,listen:听 163_164,comment:评 161_162,focus:首页焦点 6,imp_news:要闻 10',
      `tag_type` varchar(20) DEFAULT NULL COMMENT '分类标签; 例如 时局,时评,碰撞',
      `title` varchar(200) NOT NULL COMMENT '文章标题',
      `content_title` varchar(100) DEFAULT NULL COMMENT '短标题',
      `sub_title` varchar(100) DEFAULT NULL COMMENT '副标题',
      `intro_title` varchar(100) DEFAULT NULL COMMENT '肩标题',
      `keywords` varchar(255) NOT NULL COMMENT '关键字列表,关键字之间用“|”分隔',
      `time` char(11) NOT NULL COMMENT '时间',
      `authors` varchar(100) DEFAULT NULL COMMENT '作者',
      `update_time` varchar(11) DEFAULT NULL COMMENT '文章更新时间',
      `description` varchar(200) DEFAULT NULL COMMENT '描述',
      `content` text COMMENT '文章内容',
      `doings_source` varchar(100) DEFAULT NULL COMMENT '来源',
      `show_type` tinyint(4) DEFAULT '0' COMMENT '1是大图,2是一张小图,3是三张图,4是图列表的一张大图,5是图列表的两张图,6是关键字搜索,7快讯',
      `image_list` text COMMENT '图片列表',
      `url` varchar(200) DEFAULT NULL COMMENT '未知',
      `share_url` varchar(300) DEFAULT NULL COMMENT '备用 文章分享地址',
      `audio` text COMMENT '音频信息',
      `video` text COMMENT '视频信息',
      `createtime` int(10) NOT NULL DEFAULT '0' COMMENT '文章创建时间',
      `modifytime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
      `is_del` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否删除[0:否,1:是]',
      PRIMARY KEY (`id`),
      UNIQUE KEY `tag_id_2` (`tag_id`,`item_id`) USING BTREE,
      KEY `tag_id` (`tag_id`) USING BTREE,
      KEY `tag_type` (`tag_type`) USING BTREE,
      KEY `title` (`title`) USING BTREE,
      KEY `item_id` (`item_id`) USING BTREE
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='稿件表'
     
    CREATE TABLE `weibo_log` (
      `lid` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '操作记录 id',
      `name` varchar(512) NOT NULL DEFAULT '非本平台' COMMENT '平台用户名',
      `user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '系统用户id',
      `platform_id` int(6) unsigned NOT NULL COMMENT '平台id',
      `related_user_id` varchar(31) NOT NULL COMMENT '微博用户id',
      `parameter` text NOT NULL COMMENT '操作的参数',
      `result` text NOT NULL,
      `item_id` varchar(20) NOT NULL COMMENT '与该操作关联的微博item',
      `time` int(11) NOT NULL COMMENT '时间,时间戳格式',
      `date` int(8) NOT NULL COMMENT '用于按天分类',
      `action_id` tinyint(4) NOT NULL DEFAULT '0' COMMENT '与该操作关联的操作名id 1:删除微博,2:修改微博,3:重新发送微博,4:立即发送',
      `result_id` tinyint(4) NOT NULL DEFAULT '0' COMMENT '状态类别 1:发布成功, 2:待发送, 3:发送失败, 4:已删除',
      `ip` varchar(48) NOT NULL COMMENT '操作的IP',
      `location` varchar(128) NOT NULL COMMENT '该操作的地理信息',
      `timer_id` int(10) NOT NULL DEFAULT '0' COMMENT '定时任务的id',
      `del_name` varchar(25) DEFAULT NULL COMMENT '执行操作的人',
      `comment_count` int(10) NOT NULL DEFAULT '0' COMMENT '该条微博的评论数',
      `repost_count` int(10) NOT NULL DEFAULT '0' COMMENT '该条微博的转发数',
      `praise_count` int(10) NOT NULL DEFAULT '0' COMMENT '该条微博的点赞数',
      `editors` varchar(512) NOT NULL COMMENT '编辑 多个 逗号分隔',
      `author_departments` varchar(512) NOT NULL COMMENT '部门_微博作者 多个 逗号分隔',
      `is_crawl` tinyint(4) NOT NULL DEFAULT '0' COMMENT '是抓取过来的,非本平台的,默认0',
      PRIMARY KEY (`lid`),
      KEY `platform_id` (`platform_id`),
      KEY `user_id` (`user_id`),
      KEY `time` (`time`),
      KEY `date` (`date`),
      KEY `result_id` (`result_id`),
      KEY `action_id` (`action_id`),
      KEY `is_crawl` (`is_crawl`),
      CONSTRAINT `weibo_log_ibfk_1` FOREIGN KEY (`platform_id`) REFERENCES `weibo_platform` (`platform_id`) ON DELETE NO ACTION ON UPDATE CASCADE
    ) ENGINE=InnoDB AUTO_INCREMENT=73 DEFAULT CHARSET=utf8 COMMENT='微博 操作记录'
     
    个人经验之谈:
     
    1.id: 每个表应该都有一个id   unsigned NOT NULL AUTO_INCREMENT COMMENT 'user id' 参考了下discuz中的各个表 发现他的id 一般有 int(10) mediumint(8) smallint(6) 个人偏向于习惯用int(10) 当然针对具体情况可稍作调整
     
    2.name:这个字段得看需求中的name具体表示什么了,如果是用户姓名个人觉得用varchar(15)就足以了(中文),如果是用户随便输的一个标志名如nickname、filename那就设置成varchar(255),省事,免得多想,如果是固定长度的就用char吧
     
    3.password:密码字段,这就得看这个密码是怎么加密的,简单的如PHP的md5加密一般就用char(32),hash加密char(48)
     
    4.email:邮件字段,设计成varchar(100)差不多了,别多想
     
    5.mobile:char(11)没啥说的,如果是座机就另建一个字段吧
     
    6.remark: 评论字段一般就用text,还用到这个字段的比如文章内容、描述
     
    7.subscribed:是否订阅,类型这样的只有两面性质的字段如sex 、is_recommend、is_super 就定义成boolean,也有根据自己的项目定义成tinyint(1)型的(0和1两个值),有超过两面性质的就用enum枚举类型的,如status(状态值)
     
    8.与时间有关的比如login_time  create_time  modify_time 这样的字段,个人习惯定义成timestamp形如2016-04-06 14:18:24或者int(10)形式如1430833379,方便计算和转换
     
    9.IP:个人习惯用int(15) unsigned NOT NULL  用这类定长的字段会为你带来查询上的优势,尤其是当你需要使用这样的WHERE条件:IP between ip1 and ip2
     
    10.title:这种文章标题可用varchar(200)
     
    11.记录时间的字段一般用int(10) 方便查询
     
    注意事项:
    1.当表字段设置的set类型有0这个值时在写sql语句的过程中需要把对应的整型0变换成字符串0,否则插入不成功
     
    2.为常用的条件字段(where后面出现的字段)建立索引,效果特别明显
     
    3.尽量使用NOT NULL 除非有一个非常特别的理由去使用NULL
     
    4.两张表通过某个字段关联时(外键)因使用相同类型和形同字符集并建立索引
     
    5.取值有限而固定的性别 部门 状态值 就用enum 的 【 ENUM 类型是非常快和紧凑的。在实际上,其保存的是 TINYINT,但其外表上显示为字符串】
     
    6.能用固定长度的字段就用固定长度如char int,变长的如 varchar blog text 
     
    7.根据不同场景使用合适的存储引擎(可以参考这个http://www.youdiancms.com/info/348.html)
     
    8.为每一个字和表写明注释,方便自己更方便他人
     
    暂时只能想到这么多了,以后根据经验再补充吧~
     
    更多参考:
     
  • 相关阅读:
    NOIP 模拟 序列操作
    LUOGU 1525 关押罪犯
    HDU2473 Junk-Mail Filter
    BZOJ 2096 Pilots
    luogu 3939 数颜色
    NOIP模拟 赌博游戏
    Unity3D
    HTML5
    Cocos2d-x——支持多触点
    Cocos2d-x——Cocos2d-x 屏幕适配总结
  • 原文地址:https://www.cnblogs.com/ryanlamp/p/5535890.html
Copyright © 2011-2022 走看看