Mysql建表与索引使用规范整理

  一,设计表规范:

  MySQL建表,字段需设置为非空,需设置字段默认值;

  MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL;

  MySQL建表,如果字段等价于外键,应在该字段加索引;

  MySQL建表,不同表之间的相同属性值的字段,列类型,类型长度,是否非空,是否默认值,需保持一致,否则无法正确使用索引进行关联对比;

  MySQL使用时,一条SQL语句只能使用一个表的一个索引。所有的字段类型都可以索引,多列索引的属性最多15个;

  如果可以在多个索引中进行选择,MySQL通常使用找到最少行的索引,索引唯一值最高的索引;

  建立索引index(part1,part2,part3),相当于建立了 index(part1),index(part1,part2)和index(part1,part2,part3)三个索引;

  MySQL针对like语法必须如下格式才使用索引;

  SELECT * FROM t1 WHERE key_col LIKE ‘ab%’ ;

  SELECT COUNT(*) 语法在没有where条件的语句中执行效率没有SELECT COUNT(col_name)快,但是在有where条件的语句中执行效率要快;

  在where条件中多个and的条件中,必须都是一个多列索引的key_part属性而且必须包含key_part1。各自单一索引的话,只使用遍历最少行的那个索引;

  在where条件中多个or的条件中,每一个条件,都必须是一个有效索引;

  ORDER BY 后面的条件必须是同一索引的属性,排序顺序必须一致(比如都是升序或都是降序);

  所有GROUP BY列引用同一索引的属性,并且索引必须是按顺序保存其关键字的;

  14.、 JOIN 索引,所有匹配ON和where的字段应建立合适的索引;

  对智能的扫描全表使用FORCE INDEX告知MySQL,使用索引效率更高。

  定期ANALYZE TABLE tbl_name为扫描的表更新关键字分布 ;

  定期使用慢日志检查语句,执行explain,分析可能改进的索引;

  条件允许的话,设置较大的key_buffer_size和query_cache_size的值(全局参数),和sort_buffer_size的值(session变量,建议不要超过4M);

  二,命名规范 :

  1.主键的命名采用如下规则:

  主键名用pk_开头,后面跟该主键所在的表名。主键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。主键名用小写的英文单词来表示。

  2.外键的命名采用如下规则:

  外键名用fk_开头,后面跟该外键所在的表名和对应的主表名(不含t_)。子表名和父表名自己用下划线(_)分隔。外键名长度不能超过30个字符。如果过长,可对表名进行缩写。缩写规则同表名的缩写规则。外键名用小写的英文单词来表示。

  3.索引的命名采用如下规则:

  1)索引名用小写的英文字母和数字表示。索引名的长度不能超过30个字符;

  2)主键对应的索引和主键同名;

  3)唯一性索引用uni_开头,后面跟表名。一般性索引用ind_开头,后面跟表名;

  4)如果索引长度过长,可对表名进行缩写。缩写规则同表名的缩写规则;

  5)索引基本语法;

  CREATE INDEX 索引名称 ON 表名(字段);

  show index from 表名 ;

  drop index 索引名称 on 表名;

  6)唯一值越多的字段,使用索引的效果越好。设置联合索引时,唯一值越多的,越应该放在“左侧”;

  三,SQL语句优化规范 :

  使用mysql explain 对sql执行效率进行检测 ,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。

  1) 使用方法:在select语句前加上explain即可;

  2) explain 分析结果形式如下:

  table | type | possible_keys | key | key_len | ref | rows | Extra

  explain 分析结果形式中各属性含义;

  table :显示这一行的数据是关于哪张表的;

  type :这是重要的列,显示连接使用了何种类型。从最好到最差的连接类型为const、eq_reg、ref、range、indexhe和ALL;

  possible_keys :显示可能应用在这张表中的索引。如果为空,没有可能的索引。可以为相关的域从WHERE语句中选择一个合适的语句;

  key :实际使用的索引。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个索引或者用IGNORE INDEX(indexname)来强制MYSQL忽略索引;

  key_len:使用的索引的长度。在不损失精确性的情况下,长度越短越好;

  ref:显示索引的哪一列被使用了,如果可能的话,是一个常数;

  rows:MYSQL认为必须检查的用来返回请求数据的行数;

  Extra :返回的描述的意义 尽量使用 "inner join " 查询替换子查询条件中的 "in " ,防止由于数据量过大,引发数据库挂起问题 ;

  3.使用索引应注意问题:

  1)查询语句的where条件后边使用 “!=”或“<>”时,索引不生效,和普通字段一样;

  2)查询语句的where条件后边使用字符串函数或其他函数,索引不生效,和普通字段一样;

  3)使用连接(join)查询时,只有在主键和外键的数据类型相同时索引才会生效;

  4)查询语句的where条件后边使用Like关键字应注意,like ‘%jx%’ 和 like '%jx’方式索引均不生效, like 'jx%'方式索引生效;

  5)InnoDB数据表不支持全文索引;

mysql 建表时创建唯一索引相关推荐

  1. mysql建表时错误1075_navicat出现错误1075怎么办

    MYSQL中AUTO_INCREMENT会在新记录插入表中时生成一个唯一的数字.希望在每次插入新记录时,自动地创建主键字段的值,可以在表中创建一个 auto-increment 字段. mysql创建 ...

  2. mysql建表时主键_mysql建表时设置主键的方法

    mysql建表时设置主键的方法 发布时间:2020-10-10 15:17:28 来源:亿速云 阅读:119 作者:小新 mysql建表时设置主键的方法?这个问题可能是我们日常学习或工作经常见到的.希 ...

  3. mysql 建表时建立索引_mysql 分享建表和索引的几点规范

    一. MySQL建表,字段需设置为非空,需设置字段默认值. 二. MySQL建表,字段需NULL时,需设置字段默认值,默认值不为NULL. 三. MySQL建表,如果字段等价于外键,应在该字段加索引. ...

  4. Python3 使用 pymysql 连接 MySQL 建表时出现 Warning3719 UTF8 警告

    在学习 Python3 爬虫关系型数据库储存时,利用 pymysql 连接 MySQL 建表,测试用的代码如下,第一句 SQL 用于获取当前 MySQL 的版本信息,第二句 SQL 执行创建 spid ...

  5. mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义

    1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...

  6. MySQL 建表时的四种key

    mysql的key和index多少有点令人迷惑,这实际上考察对数据库体系结构的了解的. 1 key 是数据库的物理结构,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查 ...

  7. mysql建表时主键_mysql建表时怎么设置主键?

    设置方法:在"CREATE TABLE"语句中,通过"PRIMARY KEY"关键字来指定主键,语法格式"字段名 数据类型 PRIMARY KEY [ ...

  8. MySQL建表时Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP

    问题描述:在利用MySQL语句建立表结构时出现了Error Code : 1293 Incorrect table definition; there can be only one TIMESTAM ...

  9. mysql插入记录时违反唯一索引的处理

    如果表中定义了唯一索引,而我们插入记录要避免违反这个约束,该怎么弄? 最原始的办法,是先查找一下,确认不违反,才插入.现在都用ORM框架来操作数据库,搞不好还要分成两个步骤,调用2个方法才能完成.或者 ...

最新文章

  1. GBK字符集和UTF8字符集的转换C++
  2. 【DIY】震精!他居然用esp8266做出掌上游戏机......恐龙跑酷游戏还能这样玩!请广泛转发!...
  3. 过滤输入字符串中的危险字符
  4. jmeter压测过程中内存溢出
  5. MongoDB 设置权限认证
  6. android线性布局快捷键,【整理】Android图形界面知识学习与总结之:Linear Layout线性布局...
  7. java map 泛型 反射_Java通过反射读取泛型
  8. 工厂模式,简单工厂模式,抽象工厂模式三者有什么区别
  9. 多线程爬取图片 -Java
  10. html怎么让鼠标自动移动位置,手把手教你编作弊软件之 鼠标自动移动/点击
  11. python数据分析有哪些模型-python数据挖掘的基本流程有哪些?
  12. 记一次UDP的sendto函数错误解决
  13. Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  14. Proxy-NCA Loss、Proxy Anchor Loss
  15. IKBC键盘win键失灵解决方法
  16. win10x64下安装anaconda、配置tensorflow并在jupyter和pycharm中使用tf
  17. 推荐几款HTML5开发工具
  18. python中flatten_Python中flatten用法
  19. [MySQL]初始JDBC编程
  20. 智能金融再突破·TAI让反洗钱更快一步

热门文章

  1. [附源码]计算机毕业设计JAVA个性化新闻推荐系统
  2. c语言输入一行未知个数数字存入数组
  3. 农历生日和阳历生日同一天是哪一天
  4. ValueError: Exception encountered when calling layer “max_pooling2d_1“ (type MaxPooling2D).
  5. 闲鱼上哪些商品抢手?Python 分析后告诉你
  6. 麒麟980可以升级鸿蒙吗,这五部麒麟980手机确定能升鸿蒙OS,其中有你吗?
  7. 101 Fabulous Freebies(101个卓越的免费软件!)
  8. 1年20国!ofo用共享单车能否冲破海外流量魔障
  9. 回答读者朋友的2道题
  10. 你好请问计算机房在几楼,电梯机房一般在几楼