PHP 之Mysql优化
一、建立索引
普通索引 index: 对关键字没有要求。
唯一索引 unique index: 要求关键字不能重复。同时增加唯一约束。
主键索引 primary key: 要求关键字不能重复,也不能为NULL。同时增加主键约束。
全文索引 fulltext key: 关键字的来源不是所有字段的数据,而是从字段中提取的特别关键词。
索引的管理:
- 建表时

- 更新表结构

1、前缀索引
建立前缀索引的语法:
alter table test add KEY (name(5));
name一定是字符类型(索引字段),5为长度
那好,如何确定取前面几个字符呢?显然,这个场景是一个观察的结果,也就是说,必须要有一定量的实际数据,我们才能分析出其规律,也就是说这个索引是在后期优化得来的,前期没必要建立。
- 计算不重复的概率:
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;
…
2、全文索引
该类型的索引特殊在:关键字的创建上。为了解决 like ‘%keyword%’这类查询的匹配问题。

查询 标题或者内容包含 database 关键字的记录。
形成的SQL如下:
Select * from articles where title like ‘%database%’ or body like ‘%database%’;
此时需要建立全文索引

直接使用上面的SQL:
需要使用特殊的全文索引匹配语法才可以生效:
Match() against();

注意:mysql提供的全文索引不能对中文起作用,可以采用Sphinx索引引擎。
Match() against() ,返回的关键字的匹配度(关键字与记录的关联程度)。

3、Explain 执行计划
可以通过在select语句前使用 explain,来获取该查询语句的执行计划,而不是真正执行该语句。

二、查询缓存(query_cache)
查看缓存配置:

开启并设置大小:


注意事项:
1、严格保证SQL一致,区分大小写等。
2、 如果查询时包含动态数据,则不能被缓存。
3、一旦开启查询缓存,MySQL会将所有可以被缓存的select语句都缓存。如果存在不想使用缓存的SQL执行,则可以使用 SQL_NO_CACHE语法提示达到目的。
三、分区
1、分区语法
Create table table_name (
定义
)
Partition by 分区算法 (参数) 分区选项。
注意:分区与存储引擎无关,是MySQL逻辑层完成的。
通过变量查看当前mysql是否支持分区:

分区算法:
MySQL提供4种
取余:Key,hash
条件:List,range
提示,参与分区的参数字段需要为主键的一部分。
- key - 按照某个字段进行取余

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

注意:Key,hash都是取余算法,要求分区参数,返回的数据必须为整数。
List - 需要指定的每个分区数据的存储条件

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

2、管理分区语法
- 取余:key和hash
增加分区数量:

减少分区数量:

采用取余算法的分区数量的修改,不会导致已有分区数据的丢失,需要重新分配数据到新大地分区。
- 条件:List和Range
添加分区:

删除分区:

注意:删除条件算法的分区,导致分区数据丢失。
四、分表
1、水平分表案例
创建结构相同的N个表:

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

PHP客户端逻辑:

2、垂直分表
表中存在多个字段。
常用字段 - 非常有字段
主要目的,减少每条记录的长度。
例如学生表可以分成:
基础表和额外表,两张表中记录为1:1的关系。
案例:
基础信息表
Student_base
Id name age
额外信息表
Student_extra
Id 籍贯 政治面貌
五、架构层面


六、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;
七、慢查询日志
查看慢查询日志:

开启日志:

日志信息如下:

PHP 之Mysql优化的更多相关文章
- MySQL优化聊两句
原文地址:http://www.cnblogs.com/verrion/p/mysql_optimised.html MySQL优化聊两句 MySQL不多介绍,今天聊两句该如何优化以及从哪些方面入手, ...
- 0104探究MySQL优化器对索引和JOIN顺序的选择
转自http://www.jb51.net/article/67007.htm,感谢博主 本文通过一个案例来看看MySQL优化器如何选择索引和JOIN顺序.表结构和数据准备参考本文最后部分" ...
- mysql 优化
1.存储过程造数据 CREATE DEFINER=`root`@`localhost` PROCEDURE `generate_test_data`(`n` int) begin declare i ...
- mysql优化笔记之分页
过年闲得蛋疼,于是看看mysql优化,看了网上好多关于分页的优化方法,但是呢,我亲自试上一把的时候,没有出现他们说的现象...难道是我的机器问题么? 下面看看我的实践记录,希望看到的加入进来交流一下O ...
- MySQL优化概述
一. MySQL优化要点 MySQL优化是一门复杂的综合性技术,主要包括: 1 表的设计合理化(符合 3NF,必要时允许数据冗余) 2.1 SQL语句优化(以查询为主) 2.2 适当添加索引(主键索引 ...
- MySQL优化实例
这周就要从泰笛离职了,在公司内部的wiki上,根据公司实际的项目,写了一些mysql的优化方法,供小组里的小伙伴参考下,没想到大家的热情很高,还专门搞了个ppt讲解了一下. 举了三个大家很容易犯错的地 ...
- Mysql优化系列(2)--通用化操作梳理
前面有两篇文章详细介绍了mysql优化举措:Mysql优化系列(0)--总结性梳理Mysql优化系列(1)--Innodb引擎下mysql自身配置优化 下面分类罗列下Mysql性能优化的一些技巧,熟练 ...
- mysql优化记录
老板反应项目的反应越来越慢,叫优化一下,顺便学习总结一下mysql优化. 不同引擎的优化,myisam读的效果好,写的效率差,使用场景 非事务型应用只读类应用空间类应用 Innodb的特性,innod ...
- mysql 优化实例之索引创建
mysql 优化实例之索引创建 优化前: pt-query-degist分析结果: # Query 23: 0.00 QPS, 0.00x concurrency, ID 0x78761E301CC7 ...
- MySQL优化的奇技淫巧之STRAIGHT_JOIN
原文地址:http://huoding.com/2013/06/04/261 问题 通过「SHOW FULL PROCESSLIST」语句很容易就能查到问题SQL,如下: SELECT post.* ...
随机推荐
- RHEL6搭建网络yum源软件仓库
RHEL的更新包只对注册用户生效,所以需要自己手动改成Centos的更新包 一.查看rhel本身的yum安装包 rpm -qa | grep yum 二.卸载这些软件包 rpm -qa | grep ...
- Fedora 30系统的升级方法
Fedora 30 已经发布了.你可能希望将系统升级到最新版本的 Fedora.Fedora 工作站版本有图形化升级的方法.另外,Fedora 也提供了一个命令行方法,用于将 Fedora 29 升级 ...
- VUE基础回顾6
1.ref ref可以直接访问元素,而不需要使用querySelector或者其他dom节点的原生方法. <div ref = "box"></div> 在 ...
- 深入了解Cookie和Session
会话(Session)跟踪是Web程序中常用的技术,用来跟踪用户的整个会话.常用的会话跟踪技术是Cookie与Session.Cookie通过在客户端记录信息确定用户身份,Session通过在服务器端 ...
- SAP成都研究院的小伙伴们庆祝公司再次获得2019年最佳雇主的场景
日前,怡安集团旗下全球领先的人力资本管理咨询机构怡安翰威特与全球高管寻聘和领导力顾问公司史宾沙旗下Kincentric共同揭晓2019年中国最佳雇主榜单.SAP中国研究院凭借企业的创新文化和多元环境, ...
- 升级tinyhttpd-0.1.0,让其支持网页显示图像
tinyhttpd是学习http协议非常好的工具,但是由于其过于简单,不支持在网页上显示图片,所以我改了一些代码,让tinyhttpd可以现实图像,供新手一起学习和熟悉http协议,ubuntu14. ...
- Cannot assign to read only property 'exports' of object '#<Object>' ,文件名大小写问题!!!
有些坑不知道怎么就掉进去,可能一辈子都爬不起来!!! 一.错误描述 昨天还好好的,今天早上来从git获取了一下别人提交的代码就出错了!而提交代码的人 运行一点错误都没有!!! cya@KQ-101 M ...
- day 04 预科
目录 变量 什么是变量 变量的组成 变量名的命名规范 注释 单行注释 多行注释 turtle库的使用 今日内容 数据类型基础 变量 具体的值 存不是目的,取才是目的 为了描述世界万物的状态,因此有了数 ...
- ansible中的常用循环模块with_items
ansible中的循环模块有很多,不过with_items最为常用,且较为简单,循环模块最多的功能就是将重复性的任务简单化,如下例子所示: - hosts: all remote_user: root ...
- OpenStack核心组件-nova计算服务
1. nova介绍 Nova 是 OpenStack 最核心的服务,负责维护和管理云环境的计算资源.OpenStack 作为 IaaS 的云操作系统,虚拟机生命周期管理也就是通过 Nova 来实现的. ...