Mysql性能优化二

建立适当的索引

1、索引的原理说明

btree类型的索引,就是使用的二分查找法,肯定快啊,算法复杂度是log2N,也就是说16条数据查4次,32条数据查5次,64条数据查6次....依次类推。使用索引跟没使用索引的区别,就跟我们使用新华字典查字,一个是根据拼音或者笔画查找,一个是从头到尾一页一页翻。

2、索引的代价

  • 磁盘占用
  • 对dml(update delete insert)语句的效率影响

btree 方式检索,算法复杂度: log2N 次数

3、哪些列上适合添加索引

  • 较频繁的作为查询条件字段应该创建索引
select * from emp where empno = 1;
  • 唯一性太差的字段不适合单独创建索引,即使频繁作为查询条件
select * from emp where sex = ‘男‘
  • 更新非常频繁的字段不适合创建索引
select * from emp where logincount = 1
  • 不会出现在WHERE子句中的字段不该创建索引

4、索引的类型

  • 主键索引,主键自动的为主索引 (类型Primary)
  • 唯一索引 (UNIQUE)
  • 普通索引 (INDEX)
  • 全文索引 (FULLTEXT) [适用于MyISAM] ——》sphinx + 中文分词    coreseek [sphinx 的中文版 ]
  • 综合使用=>复合索引

5、四种索引的区别

  • PRIMARY 索引 =》在主键上自动创建
  • UNIQUE 索引=> 只要是UNiQUE 就是Unique索引.(只能在字段内容不重复的情况下,才能创建唯一索引)
  • INDEX 索引=>就是普通索引
  • FULLTEXT => 只在MYISAM 存储引擎支持, 目的是全文索引,在内容系统中用的多, 在全英文网站用多(英文词独立). 中文数据不常用,意义不大,国内全文索引通常使用 sphinx来完成,全文索引只能在 char varchar text字段创建.
  • 使用全文索引,不能使用like语句,这样就不会使用到全文索引了.

6、索引的使用

下列几种情况下有可能使用到索引:

  • 对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。
explain select * from dept where dname=‘研发部‘; 会显示使用到了索引myind

explain select * from dept where loc=‘MsBDpMRX‘; 不会显示使用到了索引myind
  • 对于使用like的查询,查询如果是  ‘%aaa‘ 不会使用到索引, ‘aaa%‘ 会使用到索引。
explain select * from dept where dname like ‘%研发部‘; 不会显示使用到了索引myind

explain select * from dept where dname like ‘研发部%‘; 会显示使用到了索引myind

下列的表将不使用索引:

  • 如果条件中有or,即使其中有条件带索引也不会使用。
  • 对于多列索引,不是使用的第一部分,则不会使用索引。
  • like查询是以%开头
  • 如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须‘‘)
select * from dept from dname=1234; //不会使用到索引

select * from dept from dname=‘1234‘; //会使用到索引
  • 如果mysql估计使用全表扫描要比使用索引快,则不使用索引。

7、查看索引的使用情况

  • show status like ‘Handler_read%‘
  • handler_read_key:这个值越高越好,越高表示使用索引查询到的次数。
  • handler_read_rnd_next:这个值越高,说明查询低效。

常用SQL优化

1、对于MyISAM:

alter table table_name disable keys;
loading data//insert语句;
alter table table_name enable keys;

2、对于Innodb:

  • 将要导入的数据按照主键排序
  • set unique_checks=0,关闭唯一性校验。
  • set autocommit=0,关闭自动提交。

3、优化group by 语句

默认情况,MySQL对所有的group by col1,col2进行排序。这与在查询中指定order by col1, col2类似。如果查询中包括group by但用户想要避免排序结果的消耗,则可以使用order by null禁止排序;有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

如果想要在含有or的查询语句中利用索引,则or之间的每个条件列都必须用到索引,如果没有索引,则应该考虑增加索引

 select * from 表名 where 条件1=‘‘ or 条件2=‘tt‘

explain select * from dept group by dname; =>这时显示 extra: using filesort 说明会进行排序

explain select * from dept group by dname order by null =>这时不含有显示 extra: using filesort 说明不会进行排序

***有些情况下,可以使用连接来替代子查询。因为使用join,MySQL不需要在内存中创建临时表。

explain select * from emp , dept where emp.deptno=dept.deptno;

和下面比较就可以说明问题!!

explain select * from emp left join dept on emp.deptno=dept.deptno;

选择合适的存储引擎

1、常用的存储引擎

MyISAM:Mysql5.5默认的MySQL存储引擎。如果应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。其优势是访问的速度快。

InnoDB:Mysql5.6默认的MySQL存储引擎,提供了具有提交、回滚和崩溃恢复能力的事务安全。但是对比MyISAM,写的处理效率差一些并且会占用更多的磁盘空间。

Memory:数据存在内存中,服务重启时,数据丢失

MyISAM: 在插入数据时,默认放在最后. ,删除数据后,空间不回收.(不支持事务和外键)

InnoDB 支持事务和外键,对应我们程序员说,常用的存储引擎主要是 myisam / innodb / memory,heap 表

如果选用小原则:

  • 1.如果追求速度,不在乎数据是否一直保存,也不考虑事务,请选择 memory 比如存放用户在线状态.
  • 2.如果表的数据要持久保存,应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性要求不是很高。选用MyISAM
  • 3.如果需要数据持久保存,并提供了具有提交、回滚和崩溃恢复能力的事务安全,请选用Innodb

选择合适的数据类型

1、在精度要求高的应用中,建议使用定点数来存储数值,以保证结果的准确性。能用deciaml就不要用float

create table temp1( t1 float(10,2), t2 decimal(10,2));

insert into temp1 values(1000000.32,1000000,32); 发现 t1 成了 1000000.31 所以有问题.

2、对于存储引擎是MyISAM的数据库,如果经常做删除和修改记录的操作,要定时执行optimize table table_name;功能对表进行碎片整理。

create table temp2( id int) engine=MyISAM;
insert into temp2 values(1); insert into temp2 values(2); insert into temp2 values(3);
insert into temp2 select * from temp2;--复制
delete from temp2 where id=1; --发现该表对应的数据文件没有变小

3、日期类型要根据实际需要选择能够满足应用的最小存储的早期类型

create table bbs(id int ,con varchar(1024) , pub_time int);

date(‘Ymd‘,时间-3*24*60*60); 2038年-1-19

文章转载自http://www.cnblogs.com/jiekzou/p/5380073.html

原文地址:https://www.cnblogs.com/charliedaifu/p/10585493.html

时间: 2024-10-15 17:52:43

Mysql性能优化二的相关文章

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一)

SQL索引一步到位(此文章为“数据库性能优化二:数据库表优化”附属文章之一) SQL索引在数据库优化中占有一个非常大的比例, 一个好的索引的设计,可以让你的效率提高几十甚至几百倍,在这里将带你一步步揭开他的神秘面纱. 1.1 什么是索引? SQL索引有两种,聚集索引和非聚集索引,索引主要目的是提高了SQL Server系统的性能,加快数据的查询速度与减少系统的响应时间 下面举两个简单的例子: 图书馆的例子:一个图书馆那么多书,怎么管理呢?建立一个字母开头的目录,例如:a开头的书,在第一排,b开头

数据库性能优化二:数据库表优化

数据库优化包含以下三部分,数据库自身的优化,数据库表优化,程序操作优化.此文为第二部分 数据库性能优化二:数据库表优化 优化①:设计规范化表,消除数据冗余 数据库范式是确保数据库结构合理,满足各种查询需要.避免数据库操作异常的数据库设计方式.满足范式要求的表,称为规范化表,范式产生于20世纪70年代初,一般表设计满足前三范式就可以,在这里简单介绍一下前三范式 先给大家看一下百度百科给出的定义: 第一范式(1NF)无重复的列 所谓第一范式(1NF)是指在关系模型中,对域添加的一个规范要求,所有的域

mysql性能调优与架构设计笔记

1.mysql基本介绍 mysql支持多线程高并发的关系型数据库; 数据库存储引擎InnoDB.MyISAM; mysql快速崛起的原因就是他是开源的; 性能一直是mysql自豪的一大特点; 2.mysql架构组成 麻雀虽小五脏俱全,mysql虽然简单但其内部结构并不简单; mysql物理文件组成之日志文件: 错误日志error log这里记录mysql运行时严重的警告和错误,以及mysql启动和关闭的日志信息 二进制日志 binary log 记录mysql运行时所有的query和query执

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化

MySQL性能调优与架构设计——第9章 MySQL数据库Schema设计的性能优化 前言: 很多人都认为性能是在通过编写代码(程序代码或者是数据库代码)的过程中优化出来的,其实这是一个非常大的误区.真正影响性能最大的部分是在设计中就已经产生了的,后期的优化很多时候所能够带来的改善都只是在解决前妻设计所遗留下来的一些问题而已,而且能够解决的问题通常也比较有限.本章将就如何在 MySQL 数据库 Schema 设计的时候保证尽可能的高效,尽可能减少后期的烦恼. 9.1 高效的模型设计 最规范的就一定

MySQL性能调优与架构设计——第1章 MySQL 基本介绍

MySQL性能调优与架构设计——第1章 MySQL 基本介绍 前言:作为最为流行的开源数据库软件之一, MySQL 数据库软件已经是广为人知了. 但是为了照顾对MySQL还不熟悉的读者,这章我们将对 MySQL 做一个简单的介绍.主要内容包括MySQL 各功能模块组成,各模块协同工作原理, Query 处理的流程等. 1.1 MySQLServer 简介 1.1.1 什么是 MySQLMySQL 是由MySQL AB公司(目前已经被SUN公司收归麾下,SUN已经被Oracle收购)自主研发的,目

mysql性能基本调优

innodb_buffer_pool_size 80%(系统缓存池) innodb_log_file_size    4G (mysql5.5中限定的最大数值,redo日志增大提高性能,redo日志小崩溃后恢复更快) \\开始将这个值设置为512M可以拥有1G的的redo日志,会使得拥有充裕的写操作空间 max_connections 151(默认值,需要修改) innodb_file_per_table OFF(默认将所有表的数据和索引存放在共享表空间,值为ON时会为每张表建立一个.ibd文件

MySQL性能调优与架构设计——第 18 章 高可用设计之 MySQL 监控

第 18 章 高可用设计之 MySQL 监控 前言: 一个经过高可用可扩展设计的 MySQL 数据库集群,如果没有一个足够精细足够强大的监控系统,同样可能会让之前在高可用设计方面所做的努力功亏一篑.一个系统,无论如何设计如何维护,都无法完全避免出现异常的可能,监控系统就是根据系统的各项状态的分析,让我们能够尽可能多的提前预知系统可能会出现的异常状况.即使没有及时发现将要发生的异常,也要在异常出现后的第一时间知道系统已经出现异常,否则之前的设计工作很可能就白费了. 18.1 监控系统设计 系统监控

数据库服务器mysql性能调优

mysql性能调优分为4个方面 一.硬件(CPU   内存   硬盘)监控CPU  内存 硬盘的值.[[email protected] ~]# toptop - 03:58:11 up 10:05,  1 user,  load average: 0.00, 0.00, 0.00Tasks: 121 total,   1 running, 120 sleeping,   0 stopped,   0 zombieCpu(s):  0.0%us,  0.7%sy,  0.0%ni, 99.0%i

MySQL性能调优与架构设计——第 17 章 高可用设计之思路及方案

第 17 章 高可用设计之思路及方案 前言: 数据库系统是一个应用系统的核心部分,要想系统整体可用性得到保证,数据库系统就不能出现任何问题.对于一个企业级的系统来说,数据库系统的可用性尤为重要.数据库系统一旦出现问题无法提供服务,所有系统都可能无法继续工作,而不像软件中部分系统出现问题可能影响的仅仅只是某个功能无法继续服务.所以,一个成功的数据库架构在高可用设计方面也是需要充分考虑的.本章内容将针对如何构建一个高可用的 MySQL 数据库系统来介绍各种解决方案以及方案之间的比较. 17.1 利用