最近两天做需求,是要将退款和退货报表里使用的临时表改用固定表,

自己建表时,如(只是举例):

CREATE TABLE tasks (
task_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
parent_id INT UNSIGNED NOT NULL DEFAULT 0,
task VARCHAR(100) NOT NULL,
test_id INT UNSIGNED NOT NULL DEFAULT 0,
date_added TIMESTAMP NOT NULL,
date_completed TIMESTAMP,
PRIMARY KEY (task_id),
key parent_id(parent_id),
key test_id (test_id )
)engine=INNODB;

像parent_id及test_id在连表查询时,多次出现在where的条件中,所以要给他们加上索引。

在此过程中,我想了这么几个问题:为什么这里要用key而不用index呢?临时表有什么特点,它是存放在内存中吗?

问题1.mysql中index和key的区别?

---这种问题其实也是stackoverflow里的常见问题(http://stackoverflow.com/questions/1401572/what-are-differences-between-index-v-s-key-in-mysql)---

key 是数据库的物理结构,处于模型层面的,它包含两层意义,一是约束(偏重于约束和规范数据库的结构完整性),二是索引(辅助查询用的)。包括primary key, unique key, foreign key 等。

->primary key

两个作用,一是约束作用(constraint),用来规范一个存储主键和唯一性,但同时也在此key上建立了一个index;

->unique key

两个作用,一是约束作用(constraint),规范数据的唯一性,但同时也在这个key上建立了一个index;

->foreign key

两个作用,一是约束作用(constraint),规范数据的引用完整性,但同时也在这个key上建立了一个index;

总结来说:MySQL中的key是同时具有constraint和index的意义

MySQL requires every Key also be indexed, that's an implementation detail specific to MySQL to improve performance.

index是数据库的物理结构,处于实现层面的,它只是辅助查询的,它创建时会在另外的表空间(mysql中的innodb表空间)以一个类似目录的结构存储。索引要分类的话,分为前缀索引、全文本索引等;因此,索引只是索引,它不会去约束索引的字段的行为(那是key要做的事情)。   

Mysql常见索引有:主键索引、唯一索引、普通索引、全文索引、组合索引。

问题2.mysql中内存表和临时表的区别?

内存表:

1. 参数控制:max_heap_table_size=1024M。
2. 到达上线后报错,所以在同一时间需要足够的内存。
3. 表定义保存在磁盘上,数据和索引保存在内存里面。
4. 不能包含TEXT,BLOB等字段。
------------------------------------------
5.多个session,创建表的名字不能一样
6. 一个session创建会话后,对其他session也是可见的
7. data目录下只有tmp_memory.frm ,表结构放在磁盘上,数据放在内存中
8. mysql 重启或者关闭后内存表里的数据会丢失,但是表结构仍然存在
9. 可以创建索引,删除索引,支持唯一索引
10. 不影响主备,主库上插入的数据,备库也可以查到
11. show tables 看得到表  

使用内存表需注意:

-> 内存表需要自己delete数据或者drop表;需要drop权限,这点比较危险

->内存表的表结构是保存在磁盘上的,如果多个session使用同一个表名,会存在冲突;如果不需要使用表名,如果使用一次都需要创建表结构,到时候会有很多小文件存在,不利于db的维护,dba清理表也有风险;

临时表:

1. 参数控制:tmp_table_size=1024M。
2. 到达上线后创建文件在磁盘上。
3. 表定义和数据都在内存里。
4. 可以包含TEXT, BLOB等字段。
----------------------
5. 创建的表的名字可以一样
6. 表结构和数据都放在内存中
7. 会话消失表结构和数据都消失
8. 可以创建索引,删除索引
9. 主库创建的表,备库查不到,
10. show tables 看不到表

另外:临时表和内存表的ENGINE 不同,临时表默认的是MyISAM,而内存表是MEMORY

我想之前用临时表的考虑主要是下面两个特点:

-> 临时表是会话级别的,即使多个session创建的表名一样,都相互不影响

-> 会话消失,所有的都消失,这点很不利于应用排查问题

->无论内存表还是临时表都需要消耗额外的内存空间,虽然db端可以忍受,但是不太可控;

->DB端还有这个参数:max_tmp_tables 一个客户能同时保持打开的临时表的最大数量,这个值默认32,可以根据需要调整此值

参考文章:mysql的内存表和临时表

问题3.MySQL单列索引和联合索引

有同事小伙伴说,根据需要与否,你可以考虑下联合索引。

“如果你对索引的理解不够,很常见的一个错误就是,为每个列穿件独立的多音,或者按照错误的顺序创建多列索引。”

谈到索引策略,很多听到的诸如“把where条件里的列都建上索引”这样模糊的建议是非常错误的。这种方法最好的情况也只能是“一星”索引,

要实现真正更优的索引,得花精力优化索引列的顺序,或者创建一个全覆盖的索引。

---注:在《高性能MySQL》中文第三版提到了索引的评估:三星评估(three-star system)

索引将相关的记录放到一起获得一星;

如果索引中的数据顺序和查找中的排列顺序一致获得两星;

如果索引中的列包含了查询中需要的全部列则获得三星;

最近几天看《高性能MySQL》还是收获挺大,勤看书还是很有必要的,同时和实践结合起来!

后续再来补充,如有我理解不正确的地方,希望有人能提出!

mysql理论结合实际篇(一)的更多相关文章

  1. MySQL之视图篇

    MySQL之视图篇 文章目录 MySQL之视图篇 1. 概述 1.1 为什么使用视图? 1.2 视图的理解 2. 创建视图 2.1 创建单表视图 2.2 针对于多表 2.3 基于视图创建视图 3. 查 ...

  2. 学习mysql语法--基础篇(一)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分:    一.创建用户,创建数据库,给 ...

  3. 学习mysql语法--基础篇(二)

      前  言  mysql  mysql语法--本篇学习都是通过使用Navicat Premium(数据库管理工具),连接mysql数据. 本篇学习主要有两个部分: [SQL语句的组成]   DML ...

  4. mysql 开发进阶篇系列 55 权限与安全(安全事项 )

    一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限, ...

  5. mysql 开发进阶篇系列 47 物理备份与恢复(xtrabackup 的完全备份恢复,恢复后重启失败总结)

    一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全 ...

  6. mysql 开发进阶篇系列 46 物理备份与恢复( xtrabackup的 选项说明,增加备份用户,完全备份案例)

    一. xtrabackup 选项说明 在操作xtrabackup备份与恢复之前,先看下该工具的选项,下面记录了xtrabackup二进制文件的部分命令行选项,后期把常用的选项在补上.点击查看xtrab ...

  7. mysql 开发进阶篇系列 42 逻辑备份与恢复(mysqldump 的完全恢复)

    一.概述 在作何数据库里,备份与恢复都是非常重要的.好的备份方法和备份策略将会使得数据库中的数据更加高效和安全.对于DBA来说,进行备份或恢复操作时要考虑的因素大概有如下: (1) 确定要备份的表的存 ...

  8. mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

    1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间 ...

  9. 小白两篇博客熟练操作MySQL 之 第一篇

    小白两篇博客熟悉操作MySQL  之   第一篇 一.概述 1. 什么是数据库? 答: 储存数据的仓库, 如: 在ATM的事例中创建的一个db 目录, 称为数据库 2. 什么是Mysql, Oracl ...

随机推荐

  1. 【Codeforces 1132C】Painting the Fence

    Codeforces 1132 C 题意:给一些区间\([l_i,r_i]\),从中删掉两个,求剩下的区间最多能够覆盖的格子数量. 思路:首先枚举第一个删掉的区间,然后我们可以通过差分来求出每个格子被 ...

  2. treap学习笔记

    treap是个很神奇的数据结构. 给你一个问题,你可以解决它吗? 这个问题需要treap这个数据结构. 众所周知,二叉查找树的查找效率低的原因是不平衡,而我们又不希望用各种奇奇怪怪的旋转来使它平衡,那 ...

  3. Spring对JSON请求加解密

    Spring中处理JSON请求通常使用@RequestBody和@ResponseBody注解,针对JSON请求加解密和过滤字符串,Spring提供了RequestBodyAdvice和Respons ...

  4. sql server使用的相关基础知识

    1.表的管理--表和列的命名 必须以字母开头 长度不能超过128字符 不要使用sql server的保留字 只能使用如下字符A-Z,a-z,0-9,$,#,_等等 2.表的管理--支持的数据类型 字符 ...

  5. 实现Repeater控件的记录单选(二)

    前一篇<实现Repeater控件的记录单选>http://www.cnblogs.com/insus/p/7426334.html 虽然可以实现对Repeater控件的记录进行单选,但是, ...

  6. javascript中forEach()和jquery中each()的区别

    forEach是ES5中操作数组的一种方法,主要功能是遍历数组 1.forEach方法中的function回调有三个参数:第一个参数是遍历的数组内容,第二个参数是对应的数组索引,第三个参数是数组本身 ...

  7. mui 下拉刷新和上拉加载

    <body> mui文档提供了两种不同模式的下拉刷新,具体情况看文档,链接:http://dev.dcloud.net.cn/mui/pulldown/ 单 webview 模式和 双 w ...

  8. NOIp2018停课刷题记录

    Preface 老叶说了高中停课但是初中不停的消息后我就为争取民主献出一份力量 其实就是和老师申请了下让我们HW的三个人听课结果真停了 那么还是珍惜这次机会好好提升下自己吧不然就\(AFO\)了 Li ...

  9. 11.11 开课二个月零七天(ajax和bootstrp做弹窗)

    1.用ajax做弹窗显示信息详情 nation.php <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN&qu ...

  10. Caffe源码中math_functions文件分析

    Caffe源码(caffe version:09868ac , date: 2015.08.15)中有一些重要文件,这里介绍下math_functions文件. 1.      include文件: ...