一,网站优化之mysql优化;
1、前缀索引,可以通过前缀去识别唯一性,把这个前缀作为索引内容,可以节省存储索引的空间,从而提高索引的查询速度。distinct 排重操作
2,2、in条件索引使用
同时查询出id为1,3,6
select * from where id =1;
select * from where id =3;
select * from where id =6;
select * from where id in(1,3,6); //in条件可以使用到索引
3,全文索引
文本字段才能够建立全文索引
char varchar text
把字段内容里的所有文字,进行分词处理,给分词建立索引,为了解决模糊查询除了左固定。
3.1 增加全文索引
mysql > alter table articles add fulltext key (title);
mysql > alter table articles add fulltext key (body);
使用全文索引的语法结构
match (字段)against(值)
3.2 复合全文索引
mysql > alter table articles add fulltext key (title,body);
复合索引 字段同时出现,复合索引可用,字段单独出现,复合索引不可用
3.4 全文索引注意
①文本字段类型 char varchar text mysql5.6以下 myisam支持
②建立分词索引 不太好用 不符合业务使用需求
③不支持中文
④一般会使用其他所有全文索引、搜索技术代替mysql全文索引
php+sphinx java+lucene
4,分页优化
分页显示处理的原理,是使用mysql数据表查询sql语句limit(skip,length)语法
5、索引结构的类型(了解)
①非聚合型 非聚集型索引 数据文件和索引文件是分离开的 myisam
②聚合型 聚集型索引 数据文件和索引文件存储在一起额 innodb
二、缓存设置
mysql数据库的缓存,是针对sql语句的查询结果进行存储,如果再次查询此sql语句,将会把缓存到的结果返回,不需要再次遍历数据表,也达到了数据查询提高速度的效果。
①删除emp表的主键索引
为了能够查看出效果,选择删除之前的emp表中增加的empno字段的索引
mysql > alter table emp drop primary key;
②开启数据缓存操作
mysql >show variables like ‘query_cache%‘;
mysql > set global query_cache_size=64*1024*1024;
2、缓存失效
缓存会出现失效的情况,缓存如果失效,那么查询速度就会变慢。
①数据结构发生改变 写操作
3、使用不到缓存的情况
当sql语句中存在变量信息。
①时间变量 now
②随机数 rand
4、生成多个缓存
虽然查询结果一致,但是不注意sql语句规范,会生成多个缓存,但是数据结果是一样的。
①大小写
②空格
6、缓存其他操作
①查看缓存状态
mysql > show status like ‘Qcache%‘;
②重置缓存空间
mysql > reset query cache;
三、分表设计
一般情况下,数据量在百万级别或者千万级别以内,使用索引技术和缓存技术,就可以得到较好的性能。如果数据量有急速递增的趋势,突破亿级别。可以选择使用分表技术,来进行数据表分表操作,从而提高数据表的活性,查询速度变快。
1、分区表类型区别
分片
①逻辑分区 表 真实表还是同一个,逻辑是多个,实际还是同一个 原来单表的sql使用不受到影响
②物理分表 多个真实存在分表 sql语句需要确定操作哪个分表
2、四种格式的逻辑分表
逻辑分区的条件,必须是主键或者主键的一部分(联合主键)
①key/hash分表 求余方式 和业务联系不紧密的
语法:
key方式分区
create(
字段 类型
……
)
partition by key (字段) partitions 分区数目;
hash求余:
create(
字段 类型
……
)
partition by hash(字段) partitions 分区数目;
②range/list 分表 条件方式 和业务联系紧密的
语法:
Range条件:
create(
字段 类型
……
)
partition by range(字段/表达式) (
partition 名称1 values less than (常量),
partition 名称2 values less than (常量),
partition 名称3 values less than (常量),
);
List条件:
create(
字段 类型
……
)
partition by list(字段/表达式) (
partition 名称1 values in (列表1),
partition 名称2 values in (列表2),
partition 名称3 values in (列表3),
);
3、分表管理
对于分区进行后期的管理操作
3.1key/hash分表管理
增加:alter table 表名 add partition partitions 5;
减少:alter table 表名 coalesce partition 12;
以上情况不会影响原有数据,数据需要根据新的分区重新分配
3.2range/list分表管理
语法:
增加:
alter table 表名 add partition(
partition 名称 values less than (常量)
或
partition 名称 in (n,n,n)
);
减少:
alter table 表名 drop partition 分区名称;
删除分区,分区内部数据要丢失。
4、物理分表设计
数据表真实存在多个,sql语句查询时,需要提前确定操作哪个表
①水平分表
②垂直分表
4.1水平分表
数据表,进行横向切割,数据字段是完整的,数量的条数会被切分为到多个表中。
4.2垂直分表
垂直分表 是进行数据表的竖向切割,数据不是之前完整的一行数据。是把数据的多个字段,分配多个分表中。
把常用字段分为一个表,另外增加一个附表、拓展表。
平常使用多的字段的主表,如果需要获取一些不太常用信息,和附表进行连表操作查询
四、慢查询日志设置
慢查询:指sql语句执行的时间操作约定的值一个查询,被认为是‘慢查询’。
在线上运营环境,会开启慢查询日志,进行记录执行效率低的sql语句。之后,针对这些效率低的sql,进行对应的优化操作。
①慢查询日志的开启、日志位置
mysql > show variables like ‘slow_query%‘;
mysql > set global slow_query_log = 1;
②快慢时间临界点
mysql > show variables like ‘long_query_time‘;
③设置时间临界点
mysql > set long_query_time = 2;
原文:http://www.cnblogs.com/songyanan/p/7499714.html