SQL优化的核心:
减少I/0
把随机IO转成顺序IO
分区唯一的场景:用来记日志
mysql hash分区 要求分区表达式必须是整数
range, list, hash
show variables like "%partition%";
mysql 5.1 开始支持分区
SELECT * FROM `PLUGINS` WHERE PLUGIN_NAME LIKE '%partition%'\G
mysql的分区比oracle差距很大 很弱
好处是从官方手册里直接翻译过来的,老师说不要用分区哈哈哈哈
特别不重要的地方才用分区,比如说日志
delete from tb where add_date<'';
数据量太大删除不掉
用分区drop很方便
alter table tb drop partition p1;
5.6种可以自动判断不用显示声明
innodb必须有主键
主键又必须在你的分区表达式里
range(year(add_datetime))
range columns(date(add_datetime))
partition p0 values less than ('2017-01-01'),
list就是一个集合(有限的集合)
子分区名字不能重复
group_concat长度有限制 可以修改
show global variables like "%group%";
入果只命中一个效率最高
mysql partition没有全局索引,所以索引都在自己的ipdate里放
一个分区一个索引没有完整性
mysql分区没有全局索引
分区能不能达到行级锁呢?
如果要有行级锁需要针对主键或者针对唯一索引
那么这个主键或者唯一索引就有一个条件必须在分区表达式里面
range 必须by primary key 或者 unique key
如果条件能去where的主键或者unique key那么能做行级锁
如果不能基本上是去锁到一个很大的区间
分区表包括mysql的表在select期间是不能去修改表的结构的
在执行代码的过程中是锁定的
锁定表的结构
这个是由存储引擎来处理不允许更改表结构
因为这个锁是存储引擎自己来处理的 所以每个存储引擎处理的方式也不同
myisam就是全局的锁等待
innodb通过不断重试去拿锁
每个分区都是一个存储引擎的实例 他们都有自己的ibdata
其实对锁的粒度还是挺粗的 动不动就是一个range 锁
不能对临时表进行分区 上面ppt日志写错了
大部分都是时间函数,Mysql就是提倡对时间类的数据进行分期的
可用,但不可以委以重任
不要再更改sql model