您的位置:首页 > 数据库 > MySQL

(二) MySQL 优化 - 索引,慢日志,缓存,分区

2017-08-29 01:18 639 查看
1 . 全文索引

全文索引是myisam 支持,innodb 5.6以后支持. 不支持中文,如果需要全文索引支持中文,需要中间件.

关键字 :

match : 匹配

against : 对立的

fulltext : 全文索引

全文索引的使用方式 :

select * from tb_name where match(字段) against(搜索的内容)

创建全文索引

alert table tb_name ad

alert table tb_name drop index 索引名d fulltext 索引名(字段)

删除全文索引

alert table tb_name drop key 索引名

2. 前缀索引

关键字 : left
前缀索引的值什么情况下最合适?
当 left(字段名,number) 与 索引的选择一致的时候最合适.越接近越好
判断 :

索引的选择值 :

select count(distinct 字段名) /count(id) from 表名
前缀索引的选择值
select count(distinct left(字段名,number))/count(id) from 表名

创建前缀索引 :

alter table tb_name add key 索引名(字段名(长度));

3. 慢日志开启与查询

查询是否开启

show variables like '%query_log%'

show variables like 'slow_query_log' 查看慢日志是否开启

show variables like 'slow_query_log_file' 查看慢日志的位置

开启慢日志查询

set global slow_query_log = 1;

设置慢日志的慢时间界定

查看慢时间界定 : show variables like '%long%'; 默认值是 10秒

设置慢日志慢时间 : set long_query_time = 1.1111

注意 : 这里没有global 关键字 ,如果加了,设置不起作用

查看慢日志

首先知道慢日志的位置 : show variables like '%query_log%'

vim 打开慢日志进行查看分析

4 . 分区注意事项

分区不支持 外键, 不支持全文索引

innodb 要支持分区需要开启 独立空间

set global innodb_file_per_table =1 ;

分区语句是跟在建表语句()的外面, 跟engine charset 同级

分区必须包含主键或者其子集



5 . key分区

key 分区 : 指定一个字段进行分区

例 : create table partitions(id int unsigned auto_increment primary key , name varchar(20) not null default '') engine = innodb charset = utf8
partition by key(id) partitions 4

上面的例句是根据id进行分区 ,分成了4个区

减少2个分区(相当于合并掉2个分区) :

alter table tb_name coalesce partitions 2 ;

添加2个分区

alter table tb_name add partition partitions 2;

移除分区: 变成普通的样子

alter table tb_name remove partitioning;

6. hash 分区

hash :

能过平均分配到每个表中,比较好

语法 :

例 : create table partitions_hash(id int unsigned auto_increment primary key , name varchar(20) not null default '',age int unsigned,addtime int unsigned unique key ) engine = innodb charset = utf8
partition by hash(id) partitions 4

减少2个分区(相当于合并掉2个分区) :

alter table tb_name coalesce partitions 2 ;

添加2个分区

alter table tb_name add partition partitions 2;

移除分区: 变成普通的样子

alter table tb_name remove partitioning;

7. range 分区

注意 :

range 分区一定要包含所有的可能性,不然未包含的插入会出错

range分 区一定要从小包含到大

例: create table pratition_range (id int unsigned ,addtime datetime not null default '2017-01-01 00:00:00' ,primary key(id,addtime)) engine = innodb charset=utf8
partition by range(year(addtime))(

partition year60 values less than (1970),

partition year70 values less than (1980),

partition year80 values less than (1990),

partition year90 values less than (2000),

partition yearmax values less than MAXVALUE;

)

跟key 还有hash 分区的操作多了一个 删除分区的语句(数据也会删除!)

alter table tb_name drop partition 分区名字

8. list 分区

注意 :

list分区一定要包含所有的可能性,不然未包含的插入会出错

例: create table pratition_range (id int unsigned ,addtime datetime not null default '2017-01-01 00:00:00' ,primary key(id,addtime)) engine = innod

b charset=utf8
partition by list (month(addtime))(

partition spring values in (3,4,5) ,

partition summer values in (6,7,8) ,

partition autumn values in (9,10,11),

partition winter values in (12,1,2)

)

跟key 还有hash 分区的操作多了一个 删除分区的语句(数据也会删除!)

alter table tb_name drop partition 分区名字

9. 水平分表的实现

要建立一个 merge引擎建立一个连接表,用于查询,也可以用于查询跟更新

水平分表的2种常用方式

按照数量分表 ,比如有5000万数据, 每500万一个表

分成固定的表数量 : 然后程序通过 取余数 进行判断插入哪张表,这时候需要一个表来记录 最大的id数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: