MySQL优化的几个大方向

① 硬件优化
② 对MySQL配置参数进行优化(my.cnf)此优化需要进行压力测试来进行参数调整
③ SQL语句方面的优化
④ 表方面的优化
 

硬件优化

cpu,内存,硬盘等硬件的优化

MySQL参数优化

设置最大连接数
set globle max_connections = 5000;

long_query_time = 2 超过两秒的查询记录下来

log_slow_queries = /data/mysql/slowlog.log

query_cache_size = 64M

SQL语句方面的优化

●修改mysql的慢查询

show variables like ‘long_query_time’ ; //可以显示当前慢查询时间

set long_query_time=1 ;//可以修改慢查询时间

详情:https://www.cnblogs.com/luyucheng/p/6265594.html

●使用查询缓存优化查询

大多数的MySQL服务器都开启了查询缓存。这是提高性能最有效的方法之一,而且这是被MySQL引擎处理的。当有很多相同的查询被执行了多次的时候,这些查询结果会被放入一个缓存中,这样后续的相同查询就不用操作而直接访问缓存结果了。
这里最主要的问题是,对于我们程序员来说,这个事情是很容易被忽略的。因为我们某些查询语句会让MySQL不使用缓存,示例如下:
1:SELECT username FROM user WHERE    signup_date >= CURDATE()
2:SELECT username FROM user WHERE    signup_date >= '2014-06-24‘
上面两条SQL语句的差别就是
CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND()
或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。

●使用EXPLAIN关键字检测查询

●当只要一行数据时使用LIMIT 1

●只去自己需要的column,避免使用SELECT *

●添加索引(主键索引/唯一索引/全文索引/普通索引)

1.添加

1.1主键索引添加

当一张表,把某个列设为主键的时候,则该列就是主键索引

  1. 1 create table aaa
  2. 2 (id int unsigned primary key auto_increment ,
  3. 3 name varchar(32) not null defaul '');

这是id 列就是主键索引

如果你创建表时,没有指定主键索引,也可以在创建表后,在添加, 指令:

  1. 1 alter table 表名 add primary key (列名);

举例:

  1. 1 create table bbb (id int , name varchar(32) not null default ‘’);
  2. 2 alter table bbb add primary key (id);

1.2普通索引

一般来说,普通索引的创建,是先创建表,然后在创建普通索引

比如:

  1. 1 create table ccc(
  2. 2 id int unsigned,
  3. 3 name varchar(32)
  4. 4 ) 
  1. 1 create index 索引名 on (列1,列名2);

1.3创建全文索引

全文索引,主要是针对对文件,文本的检索, 比如文章(5.5版本以后,innodb 支持全文索引)

创建 :

  1. 1 CREATE TABLE articles (
  2. 2
  3. 3 id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY,
  4. 4
  5. 5 title VARCHAR(200),
  6. 6
  7. 7 body TEXT,
  8. 8
  9. 9 FULLTEXT (title,body)
  10. 10
  11. 11 )engine=myisam charset utf8;
  1. 1 INSERT INTO articles (title,body) VALUES
  2. 2
  3. 3 ('MySQL Tutorial','DBMS stands for DataBase ...'),
  4. 4
  5. 5 ('How To Use MySQL Well','After you went through a ...'),
  6. 6
  7. 7 ('Optimizing MySQL','In this tutorial we will show ...'),
  8. 8
  9. 9 ('1001 MySQL Tricks','1. Never run mysqld as root. 2. ...'),
  10. 10
  11. 11 ('MySQL vs. YourSQL','In the following database comparison ...'),
  12. 12
  13. 13 ('MySQL Security','When configured properly, MySQL ...'); 

如何使用全文索引:

错误用法:

select * from articles where body like ‘%mysql%’; 【不会使用到全文索引】

证明:

  1. 1 explain select * from articles where body like ‘%mysql%’ 

正确的用法是:

  1. 1 select * from articles where match(title,body) against(‘database’);  

测速匹配度

  1. 1 mysql> select id, match(title,body) against('dbms') from articles;

常用的词语,匹配度反而很低或者为0(假如常用的单词都要匹配的话,每条数据基本上都会匹配上,那搜索效率就很慢了) 如:

MySQL 使用一个非常简单的剖析器来将文本分隔成词。一个“词”是由文字、数据、“'” 和 “_” 组成的任何字符序列。任何在 stopword 列表上出现的,或太短的(3 个字符或更少的)的 “word” 将被忽略。

在集和查询中的每个合适的词根据其在集与查询中的重要性衡量。这样,一个出现在多个文档中的词将有较低的权重(可能甚至有一个零权重),因为在这个特定的集中,它有较低的语义值。否则,如果词是较少的,它将得到一个较高的权重。然后,词的权重将被结合用于计算记录行的相似性。

这样一个技术工作可很好地工作与大的集(实际上,它会小心地与之谐调)。 对于非常小的表,词分类不足以充份地反应它们的语义值,有时这个模式可能产生奇怪的结果。

mysql> SELECT * FROM articles WHERE MATCH (title,body) AGAINST ('MySQL');
Empty set (0.00 sec)

在上面的例子中,搜索词
MySQL 却没有得到任何结果,因为这个词在超过一半的记录行中出现。同样的,它被有效地处理为一个
stopword (即,一个零语义值的词)。这是最理想的行为 -- 一个自然语言的查询不应该从一个
1GB 的表中返回每个次行(second row)。

匹配表中一半记录行的词很少可能找到相关文档。实际上,它可能会发现许多不相关的文档。我们都知道,当我们在互联网上通过搜索引擎试图搜索某些东西时,这会经常发生。因为这个原因,在这个特殊的数据集中,这样的行被设置一个低的语义值。

详情:http://blog.sina.com.cn/s/blog_63426ff901014l2d.html

全文说明:

  1. 在mysql中fulltext 索引只针对 myisam生效(5.5版本以后,innodb 支持全文索引)
  2. mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
  3. 使用方法是 match(字段名..) against(‘关键字’)
  4. 全文索引一个 叫 停止词,  因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.

1.4唯一索引

①当表的某列被指定为unique约束时,这列就是一个唯一索引

  1. 1 create table ddd(id int primary key auto_increment , name varchar(32) unique);

这时, name 列就是一个唯一索引.

unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复.

主键字段,不能为NULL,也不能重复.

②在创建表后,再去创建唯一索引

  1. 1 create table eee(id int primary key auto_increment, name varchar(32));
  2. 2 create unique index 索引名 on 表名 (列表..);

2.查询索引

desc 表名 【该方法的缺点是: 不能够显示索引名.】

show index(es) from 表名

show keys from 表名

3.删除

alter table 表名 drop index 索引名;

如果删除主键索引。

alter table 表名 drop primary key

4.修改

先删除,再重新创建.

二叉树算法的索引实现原理:

索引的代价:

  1. 占用磁盘空间
  2. 对dml操作有影响,变慢

在哪些列上适合添加索引?

总结: 满足以下条件的字段,才应该创建索引.

a: 肯定在where条经常使用 b: 该字段的内容不是唯一的几个值(sex) c: 字段内容不是频繁变化.

使用索引的注意事项

把dept表中,我增加几个部门:

  1. 1 alter table dept add index my_ind (dname,loc); // dname 左边的列,loc就是右边的列

说明,如果我们的表中有复合索引(索引作用在多列上), 此时我们注意:

1,  对于创建的多列索引,只要查询条件使用了最左边的列,索引一般就会被使用。 explain select * from dept where loc='aaa'\G   就不会使用到索引

2,对于使用like的查询,查询如果是  ‘%aaa’ 不会使用到索引,‘aaa%’ 会使用到索引。

比如: explain select * from dept where dname like '%aaa'\G

不能使用索引,即,在like查询时,关键的 ‘关键字’ , 最前面,不能使用 % 或者 _这样的字符., 如果一定要前面有变化的值,则考虑使用 全文索引->sphinx.

3.如果条件中有or,即使其中有条件带索引也不会使用(select * from dept where dname=’xxx’ or loc=’xx’ or deptno=45)。换言之,就是要求使用的所有字段,都必须建立索引, 我们建议大家尽量避免使用or 关键字

4.如果列类型是字符串,那一定要在条件中将数据使用引号引用起来。否则不使用索引。(添加时,字符串必须’’), 也就是,如果列是字符串类型,就一定要用 ‘’ 把他包括起来.

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

表方面的优化

●永远为每张表设置一个ID主键

●越小的列会越快

对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈。所以,把我们的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问。 参看 MySQL 的文档 Storage Requirements 查看所有的数据类型。 如果一个表只会有几列罢了(比如说字典表,配置表),那么,我们就没有理由使用 INT 来做主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT 会更经济一些。如果我们不需要记录时间,使用 DATE 要比 DATETIME 好得多。 
“性别”,“国家”,“民族”,“状态”或“部门”等字段,我们知道这些字段的取值是有限而且固定的,那么,我们应该使用 ENUM 而不是 VARCHAR。

●建表符合三范式

●选择合适的存储引擎

myisam 存储: 如果表对事务要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎. ,比如 bbs 中的 发帖表,回复表.

INNODB 存储: 对事务要求高,保存的数据都是重要数据,我们建议使用INNODB,比如订单表,账号表.

MyISAM 和 INNODB的区别

1. 事务安全

2. 查询和添加速度

3. 支持全文索引(5.5版本以后,innodb 支持全文索引)

4. 锁机制

5. 外键 MyISAM 不支持外键, INNODB支持外键

●mysql读写分离

●对表进行水平分割

当一张越来越大时候,即使添加索引还慢的话,我们可以使用分表(即存在不同的表里)

●对表进行垂直分割

如果一张表某个字段,信息量大,但是我们很少查询,则可以考虑把这些字段,单独的放入到一张表中,这种方式称为垂直分割

● 如果你的数据库的存储引擎是myisam,请一定记住要定时进行碎片整理

optimize table 表名;

MySQL优化技巧总结的更多相关文章

  1. MySQL优化技巧

    目录 MySQL的特点 数据类型优化 整型类型 小数类型 字符串类型 时间类型 主键类型的选择 特殊类型的数据 索引优化 一个使用Hash值创建索引的技巧 前缀索引 多列索引 聚簇索引 覆盖索引 重复 ...

  2. 日常工作中常见的mysql优化技巧

    1.介绍一下MYSQL经常使用的优化技巧. MySQL 自带 slow log 的分析工具 mysqldumpslow ,可是没有说明.本文通过分析该脚本,介绍了其用法. slow log 是 MyS ...

  3. MySQL优化技巧之五(mysql查询性能优化)

    对于高性能数据库操作,只靠设计最优的库表结构.建立最好的索引是不够的,还需要合理的设计查询.如果查询写得很糟糕,即使库表结构再合理.索引再合适,也无法实现高性能.查询优化.索引优化.库表结构优化需要齐 ...

  4. MySQL优化技巧【持续更新】

    前言 应用程序或web网页有时慢的像蜗牛爬似的,可能是网络原因,可能是系统架构原因,还有可能是数据库原因.那么如何提高数据库SQL语句执行速度呢?下面是积累的一些优化技巧,望对君有用. 正文 1.比较 ...

  5. 项目中常用的19条MySQL优化技巧

    原文:https://segmentfault.com/a/1190000012155267 声明一下:下面的优化方案都是基于 “ Mysql-索引-BTree类型 ” 的 一.EXPLAIN 做My ...

  6. 那些可能被你忽略的MySQL优化技巧

    说明:本文中的内容适用于MySQL5.1-5.6版本,不保证新的版本中仍然适用; 且只针对于大部分常见应用场景,是否有效果应以基于实际业务数据的测试为准. 1 优先把列设置为NOT NULL 允许NU ...

  7. mysql优化技巧《转》

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

  8. MySQL优化技巧之三(索引操作和查询优化)

    对于任何DBMS,索引都是进行优化的最主要的因素.对于少量的数据,没有合适的索引影响不是很大,但是,当随着数据量的增加,性能会急剧下降.如果对多列进行索引(组合索引),列的顺序非常重要,MySQL仅能 ...

  9. MySQL优化技巧之四(数据库设计中的一些技巧)

    1. 原始单据与实体之间的关系 可以是一对一.一对多.多对多的关系.在一般情况下,它们是一对一的关系:即一张原始单据对应且只对应一个实体.在特殊情况下,它们可能是一对多或多对一的关系,即一张原始单证对 ...

随机推荐

  1. Windows四大傻X功能——那些拖慢系统性能的罪魁祸首

    最近新装了一个PC,配置还算蛮高,i7的CPU,8G内存,2T的硬盘,于是小心翼翼地装了一个干净的正版Win7,但是发现居然开机明显卡?所以做了些研究,发现即使全新安装的正版windows,居然也有些 ...

  2. Hive中笔记 :三种去重方法,distinct,group by与ROW_Number()窗口函数

    一.distinct,group by与ROW_Number()窗口函数使用方法 1. Distinct用法:对select 后面所有字段去重,并不能只对一列去重. (1)当distinct应用到多个 ...

  3. win10系统中如何解决cmd中的路径和现在电脑的用户名不一致

    假设原用户名老王,已删除,但是cmd后路径还是C:\Users\老王>,这与现在用户laowng不一致了需改为C:\Users\laowang>. .先新建一个管理员账户laowang,然 ...

  4. 实现Github和Coding仓库等Git服务托管更新

    如何使Github.Coding.Gitee 码云 同时发布更新,多个不同Git服务器之间同时管理部署发布提交 缘由 因为在Github上托管的静态页面访问加载速度较为缓慢,故想在Coding上再建一 ...

  5. LeetCode算法题-Linked List Cycle(Java实现)

    这是悦乐书的第176次更新,第178篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第35题(顺位题号是141).给定一个链表,确定它是否有一个循环. 本次解题使用的开发工 ...

  6. Python 列表&元组&字典&集合

    列表(list) 有序性,可存储任意类型的值 通过偏移存取,支持索引来读取元素,第一个索引为0 ,倒数第一个索引为-1 可变性 ,支持切片.合并.删除等操作 可通过索引来向指定位置插入元素 可通过po ...

  7. C#多线程の遇见长耗时操作以及多任务(简明记要)

    4.0用         Task.Factory.StartNew(()=>{});4.0以下用  ThreadPool.QueueUserWorkItem(()=>{})4.0以上用 ...

  8. centos7下kubernetes(9。kubernetes中用label控制pod得位置)

    Kubernetes通过label实现将pod运行在指定得node上. 默认配置下,Schesuler将pod调度到所有可用得node,有时候我们希望将pod部署到指定得node,比如将有大量磁盘I/ ...

  9. 为什么java的类是单继承的,接口是多继承的

    类 如果一个类继承了两个类,但是这两个类中有相同的方法,那么子类调用方法时,无法确定应该调用哪个父类的方法. [c++是多继承的] 接口 jdk1.7  接口可以多继承,是因为当接口中是抽象方法.不存 ...

  10. Python:Day13

    id() 查看内存地址 和while循环一样,在for循环中也可以使用break和continue,两者效果一样. repr