文档章节

MySql

巍Will
 巍Will
发布于 2017/07/05 14:09
字数 1330
阅读 10
收藏 1

1.存储引擎

主要记录下经常使用的两个表类型InnoDB和MyISAM之间的区别

1.MySQL5.5后默认采用的是InnoDB。

2.MyISAM不支持事务,而InnoDB支持。InnoDB的AUTOCOMMIT默认是打开的,即每条SQL语句会默认被封装成一个事务,自动提交,这样会影响速度,所以最好是把多条SQL语句显示放在begin和commit之间,组成一个事务去提交。

3.InnoDB支持数据行锁定,MyISAM不支持行锁定,只支持锁定整个表。即 MyISAM同一个表上的读锁和写锁是互斥的,MyISAM并发读写时如果等待队列中既有读请求又有写请求,默认写请求的优先级高,即使读请求先到,所以 MyISAM不适合于有大量查询和修改并存的情况,那样查询进程会长时间阻塞。因为MyISAM是锁表,所以某项读操作比较耗时会使其他写进程饿死。

4.InnoDB支持外键,MyISAM不支持。

5.InnoDB的主键范围更大,最大是MyISAM的2倍。

6.InnoDB不支持全文索引,而MyISAM支持。全文索引是指对char、 varchar和text中的每个词(停用词除外)建立倒排序索引。MyISAM的全文索引其实没啥用,因为它不支持中文分词,必须由使用者分词后加入空格再写到数据表里,而且少于4个汉字的词会和停用词一样被忽略掉。

7.MyISAM支持GIS数据,InnoDB不支持。即MyISAM支持以下空间数据对象:Point,Line,Polygon,Surface等。

8.没有where的count(*)使用MyISAM要比InnoDB快得多。因为MyISAM内置了一个计数器,count(*)时它直接从计数器中读,而InnoDB必须扫描全表。所以在InnoDB上执行count(*)时一般 要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?因为InnoDB中primary index是和raw data存放在一起的,而secondary index则是单独存放,然后有个指针指向primary key。所以只是count(*)的话使用secondary index扫描更快,而primary key则主要在扫描索引同时要返回raw data时的作用较大。

主键&外键&索引

主键:唯一标识一条记录,不能有重复的,不允许为空.用来保证数据的完整性.主键只能有一个.

外键:表的外键是另一表的主键, 外键可以有重复的, 可以是空值.用来和其它表简历联系使用.外键可以有多个

索引:该字段没有重复值,但可以有一个空值.用来提高查询速度,一个表可以有多个唯一索引

MyISAM 表数据和索引是分开存储,各自一个文件(表结构,数据,索引)
InnoDB 表数据和索引存在同一个表空间里,但可以有多个文件组成(表结构单独存放,数据和索引在同一个文件)

普通索引:最基本的索引,没有任何限制
唯一索引:与"普通索引"类似,不同的就是:索引列的值必须唯一,但允许有空值
主键索引:它是一种特殊的唯一索引,不允许有空值。 
全文索引:仅可用于 MyISAM 表,针对较大的数据,生成全文索引很耗时耗空间
组合索引:为了更多的提高mysql效率可建立组合索引,遵循”最左前缀“原则

聚集索引和非聚集索引的区别:聚集索引一定是唯一索引。但唯一索引不一定是聚集索引  

聚集索引,在索引页里直接存放数据,而非聚集索引在索引页里存放的是索引,这些索引指向专门的数据页的数据   

SQL优化
禁用select *
使用select count(*)统计行数
尽量少运算
尽量避免全表扫描,如果可以,在过滤列建立索引
尽量避免在where子句对字段进行null判断
尽量避免在where子句使用!= 或者<>
尽量避免在where子句使用or连接
尽量避免对字段进行表达式计算
尽量避免对字段进行函数操作
尽量避免使用不是复合索引的前缀列进行过滤连接
尽量少排序,如果可以,建立索引
尽量少join
尽量用join代替子查询
尽量避免在where子句中使用in,not in或者having,使用exists,not exists代替
尽量避免两端模糊匹配 like %***%
尽量用union all代替union
尽量早过滤
避免类型转换
尽量批量insert
优先优化高并发sql,而不是频率低的大sql
尽可能对每一条sql进行explain          

视图
存放大量频繁需要的数据,根据数据源表的操作(删改)会变化
create view v_t1 as select * from t1

常用函数
BIN() 十进制转二进制
CEILING() 向上取整
FLOOR() 想下取整
MAX(col) 取最大值,聚合使用
MIN(col) 取最小值,聚合使用
SQRT(4) 开平方
RAND() 取随机数
CURDATE() 当前日期
CURTIME() 当前时间
NOW() 当前日期时间
CONCAT() 拼接字符串    

© 著作权归作者所有

上一篇: 加解密小结
下一篇: spring事物小结
巍Will
粉丝 0
博文 17
码字总数 37695
作品 0
朝阳
程序员
私信 提问

暂无文章

读书笔记:深入理解ES6 (五)

第五章 解构:使数据访问更便捷 第1节 为什么使用解构功能?   在ES5中,开发者们从对象、数组中获取特定数据并赋值给变量,编写了很多看起来同质化的代码。例如: 1 let options = {2 ...

张森ZS
10分钟前
9
0
CentOS7 yum方式安装MySQL5.7

在CentOS中默认安装有MariaDB,这个是MySQL的分支,但为了需要,还是要在系统中安装MySQL,而且安装完成之后可以直接覆盖掉MariaDB。 1 下载并安装MySQL官方的 Yum Repository [root@localho...

roockee
19分钟前
7
0
Allegro三种自定义设置快捷键的方法

Allegro自定义设置快捷键的三种方法: 1、在Allegro PCB editor 命令窗口直接定义 2、通过修改用户变量env文件来设置快捷键 3、定义笔画为快捷键 1、在Allegro PCB editor 命令窗口直接定义 ...

demyar
23分钟前
12
0
如何做一张能让人眼前一亮的大屏?

作为在职场驰骋的社会人,提到数据可视化大家应该都不陌生了。数据可视化的作用也不用我多说,主要是利用图形化手段,更清晰直观地将数据展示。多层次、交互式的可视化分析能够方便决策者理解...

朕想上头条
24分钟前
6
0
TL138/1808/6748-EthEVM开发板硬件CPU、FLASH、RAM

TL138/1808/6748-EthEVM是广州创龙基于SOM-TL138/1808/6748核心板开发的一款开发板,具有三个网络接口。由于SOM-TL138/1808/6748核心板管脚兼容,所以此三个核心板共用同一个底板。开发板采用...

Tronlong创龙
28分钟前
9
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部