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

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

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. go标准库的学习-time

    参考https://studygolang.com/pkgdoc 导入形式: import "time" time包提供了时间的显示和测量用的函数.日历的计算采用的是公历. 1&g ...

  2. 20175310 《Java程序设计》第1周学习总结(1)安装虚拟机

    20175310 <Java程序设计>第1周学习总结(1)安装虚拟机 开学前老师在蓝墨云班课上上传了预备作业,其中有一个就是安装Linux操作系统,参考了<>,下载安装Virt ...

  3. PAT A1028 List Sorting (25 分)——排序,字符串输出用printf

    Excel can sort records according to any column. Now you are supposed to imitate this function. Input ...

  4. ESP WIFI

    esp_err_tesp_wifi_init(constwifi_init_config_t *config) 这个WIFI初始化函数是使用所有的WIFI API之前必须调用的函数: 函数的参数是一个 ...

  5. CF487E Tourists 圆方树、树链剖分

    传送门 注意到我们需要求的是两点之间所有简单路径中最小值的最小值,那么对于一个点双联通分量来说,如果要经过它,则一定会经过这个点双联通分量里权值最小的点 注意:这里不能缩边双联通分量,样例\(2\)就 ...

  6. CF1038E Maximum Matching 搜索/区间DP

    题目传送门:http://codeforces.com/problemset/problem/1038/E 题意:给出$N$个方块,每个方块有左右两种颜色$a,b$(可以翻转使左右两种颜色交换)和一个 ...

  7. vue-用Vue-cli从零开始搭建一个Vue项目

    Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组件可重复使用:数据驱动是前端的未来发展方向,释放了对 ...

  8. 解决 HttpWebResponse.GetResponse()一直提示超时

    原文首发: http://anforen.com/wp/2018/04/httpwebresponsegetresponse/ HttpWebResponse response = (HttpWebR ...

  9. .NET小笔记-NPOI读取excel内容到DataTable

    下载比较新的NPOI组件支持excel2007以上的,把.dll添加引用 引入命名空间 using NPOI.HSSF.UserModel;using NPOI.SS.UserModel;using ...

  10. JS 去除重复元素的方法

    Array.prototype.del = function () { var a = {}, c = [], l = this.length; ; i < l; i++) { var b = ...