zoukankan      html  css  js  c++  java
  • 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)

  • 相关阅读:
    【leetcode】1365. How Many Numbers Are Smaller Than the Current Number
    【leetcode】1363. Largest Multiple of Three
    【leetcode】1362. Closest Divisors
    【leetcode】1361. Validate Binary Tree Nodes
    【leetcode】1360. Number of Days Between Two Dates
    【leetcode】1359. Count All Valid Pickup and Delivery Options
    【leetcode】1357. Apply Discount Every n Orders
    【leetcode】1356. Sort Integers by The Number of 1 Bits
    ISE应用入门的一些问题
    DDR的型号问题
  • 原文地址:https://www.cnblogs.com/dk1988/p/3505116.html
Copyright © 2011-2022 走看看