MySQL数据库优化方案

Mysql的优化,大体可以分为三部分:索引的优化sql慢查询的优化表的优化

开启慢查询日志,可以让MySQL记录下查询超过指定时间的语句,通过定位分析性能的瓶颈,才能更好的优化数据库系统的性能。

Sql 慢查询优化步骤

先捕获低效SQL→慢查询优化方案→慢查询优化原则

MySQL数据库配置慢查询

参数说明:

1.查询慢查询配置

show variables like 'slow_query%';

slow_query_log 对应 开启状态

slow_query_log_file  对应 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)

2.查询慢查询限制时间,查询超过多少秒才记录,默认是10s。

show variables like 'long_query_time';

3.将 slow_query_log 全局变量设置为“ON”状态

set global slow_query_log='ON';

4.查询超过1秒就记录

set global long_query_time=1;

5.查询日志,可根据自己查询出来的实际地址进行查看,该例子是以 linux 部署的 mysql 的日志存储位置。

cat /var/lib/mysql/localhost-slow.log

6. linux中 重启 mysql 命令

service mysqld restart

索引为什么会失效?注意那些事项?

1.索引无法存储null值

2.如果条件中有or,即使其中有条件带索引也不会使用(这也是为什么尽量少用or的原因) 要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引

3.对于多列索引,不是使用的第一部分,则不会使用索引

4.like查询以%开头 5.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引

6.如果mysql估计使用全表扫描要比使用索引快,则不使用索引

举栗子说明:

#### 创建表
CREATE TABLE `user_details` (
`id` int(11) not NULL,
`user_name` varchar(50) DEFAULT NULL,
`user_phone` varchar(11) DEFAULT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

select * from user_details;

#### 新建索引
ALTER TABLE `user_details` ADD INDEX user_name_index ( `user_name` );

### 查询索引
desc user_details;

insert into user_details values(1,'ming1','123456789');
insert into user_details values(2,'ming2','123456789');
insert into user_details values(3,'ming3','123456789');
insert into user_details values(4,'ming4','123456789');
insert into user_details values(5,'ming5','123456789');
insert into user_details values(6,'ming6','123456789');

### 全表扫描
explain select * from user_details where user_phone='123456789';

### 主键索引 type=const
EXPLAIN select * from user_details WHERE id=1

#### 普通索引 type=const
EXPLAIN select * from user_details WHERE id=1 and user_name='ming1';

#### 主键索引 不能使用 % 开头,全表扫描 type=all
EXPLAIN select * from user_details WHERE id like '%sss'
#### 主键索引 % 结尾 全表扫描 type=all
EXPLAIN select * from user_details WHERE id like '1%'

#### 普通索引 %开头 会导致 索引失效 type=all
EXPLAIN select * from user_details WHERE user_name like '%1'
#### 普通索引 %结果 会导致 索引不会失效 type=range
EXPLAIN select * from user_details WHERE user_name like '1%'

##### 条件字符串不加 '' 会导致索引失效 type=all
EXPLAIN select * from user_details WHERE user_name =1;
##### 索引不会失效 type=ref
EXPLAIN select * from user_details WHERE user_name ='1';

### 全表扫描 type=all
EXPLAIN select * from user_details WHERE id='1' or user_name='ming1';

联合索引为什么需要遵循左前缀原则?

如果在一张表中,存在联合索引的话,在根据条件查询的时候必须要加上第一个索引条件。

---索引生效

EXPLAIN select * from user_details WHERE id=1 and user_name=‘yushengjun1’;

索引是不生效的

EXPLAIN select * from user_details WHERE user_name=‘yushengjun1’;

举栗子说明:

###### 联合主键索引 id + user_name 组合索引 #########
#### 联合主键索引 只要 id + user_name 保证唯一即可
CREATE TABLE `userInfo` (
`id` int(11) not NULL,
`user_name` varchar(50) not NULL,
`user_phone` varchar(11) DEFAULT NULL,
PRIMARY KEY (id,user_name)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

SELECT * from userInfo;

insert into userInfo values(1,'明天','123456789');
insert into userInfo values(1,'小明','123456789');
insert into userInfo values(2,'小红','123456789');
insert into userInfo values(2,'大白','123456789');
insert into userInfo values(3,'小龙','123456789');
insert into userInfo values(3,'小菲','123456789');

#### 只能插入成功一条数据 ,因为 id + user_name 需要保证唯一性 
insert into userInfo values(4,'小放','123456789');
insert into userInfo values(4,'小放','123456789');

####索引 有效 type=ref
EXPLAIN select * from userInfo WHERE id=1

####索引 有效 type=const
EXPLAIN select * from userInfo WHERE id=1 and user_name='明天';

#### 索引 无效 type=all
EXPLAIN select * from userInfo WHERE user_name='小明';

#### 索引有效 type=const
EXPLAIN select * from userInfo WHERE user_name='小明' and id=1

因为索引底层采用B+树叶子节点顺序排列,必须通过左前缀索引才能定位到具体的节点范围。

分表分库为什么能够提高数据库查询效率?

因为会将一张表的数据拆分成多个n张表进行存放,让后在使用第三方中间件(MyCat或者Sharding-JDBC)并行同时查询,让后在交给第三方中间进行组合返回给客户端。

MySql数据库 优化的更多相关文章

  1. 关于MySQL数据库优化的部分整理

    在之前我写过一篇关于这个方面的文章 <[原创]为什么使用数据索引能提高效率?(本文针对mysql进行概述)(更新)> 这次,主要侧重点讲下两种常用存储引擎. 我们一般从两个方面进行MySQ ...

  2. 【MySQL】花10分钟阅读下MySQL数据库优化总结

    1.花10分钟阅读下MySQL数据库优化总结http://www.kuqin.com2.扩展阅读:数据库三范式http://www.cnblogs.com3.my.ini--->C:\Progr ...

  3. 30多条mysql数据库优化方法,千万级数据库记录查询轻松解决(转载)

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  4. 50多条mysql数据库优化建议

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 缺省情况下建立的索引是非群集索引,但有时它并不是最佳的.在非群集索引下,数据在物理上随机存 ...

  5. 解开发者之痛:中国移动MySQL数据库优化最佳实践(转)

    开源数据库MySQL比较容易碰到性能瓶颈,为此经常需要对MySQL数据库进行优化,而MySQL数据库优化需要运维DBA与相关开发共同参与,其中MySQL参数及服务器配置优化主要由运维DBA完成,开发则 ...

  6. 30多条mysql数据库优化方法【转】

    1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索 ...

  7. 百万行mysql数据库优化和10G大文件上传方案

    百万行mysql数据库优化和10G大文件上传方案 最近这几天正在忙这个优化的方案,一直没时间耍,忙碌了一段时间终于还是拿下了这个项目?项目中不要每次都把程序上的问题,让mysql数据库来承担,它只是个 ...

  8. 从运维角度来分析mysql数据库优化的一些关键点【转】

    概述 一个成熟的数据库架构并不是一开始设计就具备高可用.高伸缩等特性的,它是随着用户量的增加,基础架构才逐渐完善. 1.数据库表设计 项目立项后,开发部根据产品部需求开发项目,开发工程师工作其中一部分 ...

  9. 关于mysql数据库优化

    关于mysql数据库优化 以我之愚见,数据库的优化在于优化存储和查询速度 目前主要的优化我认为是优化查询速度,查询速度快了,提高了用户的体验 我认为优化主要从两方面进行考虑, 优化数据库对象, 优化s ...

  10. mysql数据库优化 pt-query-digest使用

    mysql数据库优化 pt-query-digest使用 一.pt-query-digest工具简介 pt-query-digest是用于分析 mysql慢查询的一个工具,它可以分析binlog.Ge ...

随机推荐

  1. Java 面向对象(十四)

    反射 反射是框架设计的灵魂 一.类的加载时机 当程序要使用某个类时,如果该类还未被加载到内存中,系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 加载 :就是指将class文件读入内存,并为 ...

  2. little difference

    把一个数字分解成有限个相差不超过1的因子: 这里如果是2的n次幂就不可以,因为比如4,可以拆成 2,2,或者2,2,1,或者2,2,1,1,...所有这个不可以,没想到这个 数据是1E18,一开始想觉 ...

  3. docker-compose 布署应用nginx中的create-react-app应用获取环境变量

    文章来源:https://www.freecodecamp.org/news/how-to-implement-runtime-environment-variables-with-create-re ...

  4. boost 介绍

    简介: Boost库是一个可移植.提供源代码的C++库,作为标准库的后备,是C++标准化进程的开发引擎之一. Boost库由C++标准委员会库工作组成员发起,其中有些内容有望成为下一代C++标准库内容 ...

  5. OpenJudge计算概论-细菌实验分组

    /*====================================================细菌实验分组总时间限制: 1000ms 内存限制: 65536kB描述有一种细菌分为A.B两 ...

  6. SQL-W3School-函数:SQL MIX() 函数

    ylbtech-SQL-W3School-函数:SQL MIX() 函数 1.返回顶部 1. MIN() 函数 MIN 函数返回一列中的最小值.NULL 值不包括在计算中. SQL MIN() 语法 ...

  7. Android:ART 优化配置(Mstar-6A648)

    1.Android预优化的原理 先来回顾一下Android的发展史,在2014年的Google I/O大会上,Google隆重的发布了Android 4.4操作系统,其中有一个环节着重介绍了ART(A ...

  8. 阶段5 3.微服务项目【学成在线】_day16 Spring Security Oauth2_17-认证接口开发-申请令牌测试

    远程 调用Spring Security来申请令牌,然后把申请到令牌存储到redis里面 cookieMaxAge: ‐1   -1表示浏览器一关闭cookie就失效. 测试远程申请令牌 TestCl ...

  9. QML渐变色

    Rectangle { id: tab_btn width: height: parent.height color: "black" gradient: Gradient { G ...

  10. ubuntu 16.04 sudo nopasswd

    修改sudoers配置文件:~$ sudo vi /etc/sudoers 在文件末尾添加需要sudo输入密码的user:[user] ALL=NOPASSWD:ALL 表示sysadmin这个组在进 ...