PHP 之Mysql优化

1、创建索引html

普通索引 index: 对关键字没有要求。mysql

惟一索引 unique index: 要求关键字不能重复。同时增长惟一约束。算法

主键索引 primary key: 要求关键字不能重复,也不能为NULL。同时增长主键约束。sql

全文索引 fulltext key: 关键字的来源不是全部字段的数据,而是从字段中提取的特别关键词。缓存

索引的管理:架构

  • 建表时

  • 更新表结构

一、前缀索引优化

创建前缀索引的语法:spa

alter table test add KEY (name(5));

name必定是字符类型(索引字段),5为长度3d

那好,如何肯定取前面几个字符呢?显然,这个场景是一个观察的结果,也就是说,必需要有必定量的实际数据,咱们才能分析出其规律,也就是说这个索引是在后期优化得来的,前期不必创建。日志

  • 计算不重复的几率:
select COUNT(DISTINCT name) / COUNT(*) as rate from test;
  • 找出接近rate的一个n(试出最合理的n)
select COUNT(DISTINCT LEFT(name, 3)) / COUNT() as rate3 from test;
select COUNT(DISTINCT LEFT(name, 5)) / COUNT() as rate5 from test;
select COUNT(DISTINCT LEFT(name, 7)) / COUNT() as rate7 from test;
select COUNT(DISTINCT LEFT(name, 9)) / COUNT() as rate9 from test;
select COUNT(DISTINCT LEFT(name, 11)) / COUNT() as rate11 from test;
select COUNT(DISTINCT LEFT(name, 15)) / COUNT() as rate15 from test;
select COUNT(DISTINCT LEFT(name, 20)) / COUNT(*) as rate20 from test;
…

二、全文索引

该类型的索引特殊在:关键字的建立上。为了解决 like ‘%keyword%’这类查询的匹配问题。

查询 标题或者内容包含 database 关键字的记录。

造成的SQL以下:

Select * from articles where title like ‘%database%’ or body like ‘%database%’;

此时须要创建全文索引

直接使用上面的SQL:

须要使用特殊的全文索引匹配语法才能够生效:

Match() against();

 注意:mysql提供的全文索引不能对中文起做用,能够采用Sphinx索引引擎

Match() against() ,返回的关键字的匹配度(关键字与记录的关联程度)。

三、Explain 执行计划

能够经过在select语句前使用 explain,来获取该查询语句的执行计划,而不是真正执行该语句。

2、查询缓存(query_cache)

查看缓存配置:

 开启并设置大小:

 

注意事项:

一、严格保证SQL一致,区分大小写等。

二、 若是查询时包含动态数据,则不能被缓存。

三、一旦开启查询缓存,MySQL会将全部能够被缓存的select语句都缓存。若是存在不想使用缓存的SQL执行,则可使用 SQL_NO_CACHE语法提示达到目的。

3、分区

一、分区语法

Create table table_name (

定义

)

Partition by 分区算法 (参数) 分区选项。

 注意:分区与存储引擎无关,是MySQL逻辑层完成的。

经过变量查看当前mysql是否支持分区:

分区算法:

MySQL提供4种

取余:Key,hash

条件:List,range

提示,参与分区的参数字段须要为主键的一部分。

  • key - 按照某个字段进行取余

  • Hash - 按照某个表达式的值进行取余

 注意:Key,hash都是取余算法,要求分区参数,返回的数据必须为整数。

  • List - 须要指定的每一个分区数据的存储条件

  • Range - 条件依赖的数据是一个条件表达式

二、管理分区语法

  • 取余:key和hash

增长分区数量:

减小分区数量:

采用取余算法的分区数量的修改,不会致使已有分区数据的丢失,须要从新分配数据到新大地分区。

  •  条件:List和Range

添加分区:

删除分区:

注意:删除条件算法的分区,致使分区数据丢失。

4、分表

一、水平分表案例

建立结构相同的N个表:

 再建立用于管理学生ID的表:

PHP客户端逻辑:

 二、垂直分表

表中存在多个字段。

经常使用字段 - 很是有字段

主要目的,减小每条记录的长度。

例如学生表能够分红:

基础表和额外表,两张表中记录为1:1的关系。

 案例:

基础信息表

Student_base

Id name age

额外信息表

Student_extra

Id 籍贯 政治面貌

5、架构层面

主从复制:

 

 读写分离:

 

 6、SQL语句

将复杂的SQL拆分屡次执行。

案例:

商品,分类:

Select * from category;分类列表

Select cat_id, count(*) from goods group by goods;分类对应的商品数量。

 

分页

Limit offset, size;

 

Size = 10;

Page

offset

5

40, 10

50

490, 10

5000

4990, 10

500000

499990, 10

 

Limit 的使用,会大大提高无效数据的检索(被跳过)。

应该使用条件等过滤方式,将检索到的数据尽量精肯定位到须要的数据上。

例如分页:

Limit size;

7、慢查询日志

查看慢查询日志:

开启日志:

 日志信息以下:

相关文章
相关标签/搜索