MySQL优化

Posted min-na

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL优化相关的知识,希望对你有一定的参考价值。

1、建立基础索引:在where,order,join字段上建立索引
优化,组合索引:基于业务逻辑
前缀索引使用上与普通索引一致!

2、索引的存储结构:Btree索引,hash索引,聚簇索引
Btree不是二叉树
mysql中,仅仅只有InnoDB的主键索引是聚簇结构,其他的都是典型的BTree结构
Hash索引就是key-value,就是php中的关联数组,索引被载入到内存时

3、queryCache,当数据表结构改动,缓存失效,动态数据不能被缓存
show variables like ‘query_cache_type‘
show variables like ‘query_cache_size‘
set global query_cache_size=102760448;
select sql_cache * from student where user like ‘%fyw‘

4、分区,partition
一个表的数据和索引存储在不同文件中
//利用id字段,使用hash算法,将数据分布到10个分区内
partition by hash(id) partitions 10

5、算法

(1)hash算法:(均匀分配)
分区算法,在业务逻辑层面,表示均匀分配。
(2)0key算法:(均匀分配)
partition by key(subject) partitions 10
分区必须是主键的一部分,分区字段一定是强检索字段。
(3)range算法:(条件分配)
partition by range(pubtime)
partition p201710 values less than (1509465599),
partition p201711 values less than (1512057599)

条件必须是< less than运算符
(4)list算法:(条件分配)
也是一种条件分区,列表值分区
partition by list(status)
partition pdone values in (1,2),
partition pdod values in (3)

业务逻辑有明显差异的时候选择条件分配,无明显差异则选择均匀分配
list,range可以删除或新增分区
alter table table-name add partition
partition p201710 values less than (1509465599),
partition p201711 values less than (1512057599)

hash,key可以修改分区数量
alter table table-name add partitions 4;
alter table table-name coalesce partition 6;

只有检索字段是分区字段的时候,分区效率才会比较明显


6、分区的原因:
数据库减压
分区的算法局限(重要原因)

分区和分表都是属于水平化划分
垂直分割:每个表的记录数量是一致的,但字段不一致

7、读写分离,负载均衡
需要用到的技术,MySQL复制技术,负载均衡中间件
读写分离:
有一些MySQL服务器提供读操作,select
另一些MySQL服务器提供写操作,insert,update,delete
母的,分散压力,读服务器不会被阻塞
所有PHP的框架都支持读写分离的配置
写为主服务器,其余为读服务器

6、开启索引和约束,一次性创建索引
alter table table-name disabled keys
alter table table-name enable keys

7、MySQL主要采用一写多读架构,读操作大大多于写操作,还有就是写操作同步问题
一写多读中,读服务器就需要负载均衡工作
典型负载算法:
轮询:轮着来
加权轮询:依据能力,轮着来
负载分配:依据空闲状态


8、横向扩展Mysql服务器;读写分离、主从复制、负载均衡(高性能)
9、高可用:需要保证24小时不停机 在服务器架构时,所有单点服务器都需要配置冗余服务器,心跳检测

10、大页码,limit offset
尽量保证不用出现大的offset,在使用limit时。
11、select * 少用
单表查询代替多表查询
原因是:
多表查询的执行,join,子查询,也是一个表的去执行,执行完再去合并结果。
计算分布,单表查询,计算压力在应用程序端,多表查询,计算压力在数据库上。
多表查询,会增加表锁定时间,降低程序并发性能。
单表查询,增加了程序复杂度。使用ORM模型,模型已经做了大量的工作完成单表处理。
12、count(1)和count(*)类似,统计记录数量

13、mysqlslap压力测试工具
CMD上直接运行:mysqlslap
并发测试:mysqlslap --auto-generate-sql --concurrency=250 --iterations=10 --engine=innodb -uroot -phellokang

14、全文索引:关键字不是字段本身,而是从字段中提取的关键词,作为关键字
PHP典型的全文索引工具:Coreseek ,XunSearch,Solr都是典型的全文索引工具

以上是关于MySQL优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql 优化包括哪些内容?

Mysql的性能优化

Mysql的性能优化

mysql 子查询 优化

MySQL Optimization

MySQL优化MySQL 高并发配置优化基础知识