MYSQL 优化,持续更新收藏

先记录自己的经验

1:就是拆表 基本1G以上的表就考虑删一部分 或者拆开

3G以上的表就卡得磨人

2:索引 随便建吧 不行再删

3:left join inner join right join 还是有些区别

4:不要innodb innodb有时候秒开 有时候卡的磨人 数据量小的时候还好  数据量大基本无解 

5:时间上建立索引  就不要用 current interval 1month这些啦

php算好时间 比如一个月前 是2016-1-1  就直接time>'2016-1-1'

6 select  id from xxx  where id in (select id from  yyy ) 这种超级卡  最好不要看到这种句子  尽量想办法在xxx表中建立字段 用left join之类也比这个强很多

 

7:原则上 索引和删表能解决80%的问题  比如订单表 三个月前的删除(移动到历史库)

8:一些技巧上的

比如查询条件不要带函数 比如时间带date_format 先自己算好成时间戳再去做条件

stauts这种 最要不要用string 建议用int  0 1 2 3  数字比字符串快

9:后端使用上的

循环里面不要去查询  可以直接用join

多数情况下group by 能解决大多数问题

不行就group by 多字段+unionall +contact

原则上 一条sql 一定比多条sql省时间

如果这一条很慢 那么多数条件下 是有优化的余地

10:模型设计上的

(1)大数据量的表 尽量字段要少 尽量不要去动

比如网站的全部粉丝表 

现在突然有一天 要设置其中100个为管理员

普通做法 100w一下  是加一个字段 比如isadmin 但这样非常不好 很多对管理员的操作模型就会去链接这张极其数据量大的表

正确做法 应该新建一张管理员表来关联这个粉丝表

(2)常用的表 不要有大字段 ,分表分表 原则上不要怕表多 字段多才是灾难

(3)可以考虑innodb  但数据特大的时候就不要去查了 都没优化的余地

11:某些统计类 日志类的东西 如果特爱去查 最好每天定时去生成 比如留存  

当然 如果量小 一句sql也可以

12:善用存储过程  比如某些递归 存储过程还是蛮快的

下面是网上搜的

1,开启慢查询

功能:慢查询log能有效的记录那些查询时间较长的sql语句,便于分析优化

步骤为在my.ini下面的mysqld下面加入

log_slow_queries=slowquery.log 
long_query_time=1 
slow_query_log=ON 
log_queries_not_using_indexes=ON

步骤本来很简单,但可怜的我又折腾了好久,原因是log_slow_queries=slowquery.log这一句我按照网上的步骤

写成了:'F:wampinmysqlmysql5.5.24dataslowquery.log'这种形式,结果log死活不出来,一个偶然的机会

一不小心将log_slow_queries这一项的值改成了on,嘿,结果出来了,在data目录下面有一个名为on的log文件

才知道目录地址应该写重复了,搜索my.ini,发现有一项为

[wampmysqld]

datadir=F:/wamp/bin/mysql/mysql5.5.24/data

所以在wamp下 默认是不需要写前面的路径的

备注:环境为wamp mysql为mysql5.5.24

2,具体mysql优化

方法一:最有效的方法就是建立索引,对于经常查询且值较多的字段,有效的建立索引,查询速度立竿见影,比如id,name这些字段

ALTER TABLE 表 ADD PRIMARY KEY  (主键列比如id) 主键索引

ALTER TABLE 表 ADD UNIQUE INDEX uni_email (email) 唯一索引

ALTER TABLE 表 add index inx_email (email) 普通索引

alter table 表名 drop index 索引名;     删除索引

show index from 表名   查询索引

方法二:  表的分割(水平分割,垂直分割)

就当数据库的数据太多时,查询起来肯定慢,通过一定规则来分割数据库的表,肯定能有效提高查询速度 百万级以上

水平分割:比如1000w条数据的表

分成三个表,结构一样,表明分别为t1 t2 t3(事先这样设计好表比较方便,如果整表设计好了再分割,就自己写点代码来各种insert吧,比较浪费时间而已)

在增删改查的时候,$tablename这个可以为t.$id%3 这样所有数据会均匀的放到三个表中,当然,目前这是有个自增长id的情况下,比较简单

垂直分割:比如学生成绩,有id score paper(详细的答案信息)等字段,paper字段多数不看,但也会有小概率会去查询,但此字段最大,明显拖速度

所以可以将此表分割开来 两张表 一张为id score  一张为id paper   id对应好,那么查询分数的速度会快很多

方法三:主从分离

待编辑

方法四:网络上搜集的小技巧

(1)使用join代替一些子查询

(2)少用or ,如果条件中有or,即使其中有条件带索引也不会使用

(3)

原文地址:https://www.cnblogs.com/dk1988/p/3505116.html