1.为查询缓存优化你的查询

  1. 大多数Mysql服务器都开启了查询缓存。像now()和Rand()或是其他的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。需要用一个变量来代替Mysql的函数,从而开启缓存。

2.EXPLAIN你的SELECT查询

    使用EXPLAIN关键字可以让你知道Mysql是如何处理你的SQL语句。可以帮你分析你的查询语句或是表结构的性能瓶颈。

3.当只需要一条数据的时使用LIMIT 1

    当你查询表的时候,你已经知道结果只有一条结果,但因为你可能需要去fetch游标,或是你会去检查返回的记录数。

4.为搜索字段建索引

    索引并不一定是给主键或者唯一字段。如果在你的表中,有个某个字段你总要经常用来做搜索,为其建立索引。<br />**tips:索引失效的情况如下**
  1. where语句包含or时,可能会导致索引失效。(or左右两侧查询是否命中相同的索引)
  2. 索引列上使用内置函数,一定会导致索引失效.
  3. 类型转换和字符编码转换。
  4. 对索引进行运算。
  5. like模糊查询以%开头。
  6. 联合引索中,where中索引违背最左匹配原则。
  7. mysql优化器的最终选择,觉得全表扫描

    5.在JOIN表的时候使用相当的类型的列,并将其索引。

     程序中有很多join查询,应该确认两个表中join的字段是被建过索引的,这样Mysql内部会优化你的Sql语句。<br />join的字段应该是相同的类型的相同的字符集。
    

    6.不要使用 ORDER BY RAND()

     打乱数据随机选一个数据。Mysql执行该函数会允许RAND()函数,而且这里为了每一行记录去记行,然后对其排序。<br />        改进:用变量获取一个随机函数。
    

    7.避免SELECT *

     从数据库里读出越多的数据,那么查询就会变得越慢。并且当你的数据库和WEB服务器不是同一台服务器,还会增加网络传输的负担。
    

    8.永远为每张表设置一个ID

    9.使用ENUM而不是VARCHAR

     ENUM类型是非常快和紧凑的。在实际上,其保存的是TINYINT,但外表上显示的是字符串。
    

    10.从PROCEDURE ANALYSE()取得建议

     procedure analyse()会让Mysql帮你分析你的字段和其实际的数据,并给出意见。数据越多,建议才准确,最终还是根据具体需求和你来决定。
    

    11.尽可能使用NOT NULL

     Null也是需要空间的,并且进行比较的时候程序会变得更复杂。当然现实情况很复杂,有些情况下,也是需要使用NULL值。
    

    12.Prepared Statements

     后台SQL语句集合,无论是性能问题还是安全问题。安全就是预编译, 不会受到SQL注入式攻击;性能就是当相同的查询被多次使用的话。你可以给Prepared Statements定义一些参数,而Mysql只会解析一次。
    

    13.无缓冲的查询

     不需要等所有的结果返回,节约大量的临时内存,而且查询不需要排序。
    

    14.把IP地址存成UNSIGNED INT

     不用VARCHAR(15)字段来存放字符串。可以用整形来存,只需要4个字节,并且你有定长的字段。这样还可以使用IP between ip1 and ip2 进行条件查询。<br />        你可以使用inet_aton()来把一个字符串IP转成一个整形,并使用inet_ntoa()把一个整形转成一个字符串IP。
    

    15.固定长度的表会更快

     如果表中所有的字段都是"固定长度",整个表会被认为是"static"或"fixed-length"。如果表中含有以下字段VARCHAR、TEXT、BLOB,那么这个表就不是固定长度静态表,这样,Mysql引擎就会用另一种方法来处理。<br />        但是又副作用,就是固定长度的字段会浪费一些空间,无论你用不用,都要分配那么多的空间。<br />        可以使用垂直分割,将你的表分成两个,一个是定长,一个是不定长的。
    

    16.垂直分割

     垂直分割是一种把数据库中的表按列变成几张表的方法。这样可以降低表的复杂度和字段的数目,从而达到优化的目的。<br />        示例一:用户表中,有个详情地址,这个字段是可选字段,你并不需要经常读取或者改写这个字段,可以放到其他表中。<br />        示例二:"last_login"字段,会在每次用户登录的时候进行更新。但是每次被更新,会导致该表的查询缓存被清空。所以你可以把这个字段放到另一张表中,这样就不会影响对你的用户的查取了,因为缓存会帮你增加很多性能。<br />        需要注意的是,被你分离出去的字段形成的表,不会经常join他们。不然的话,性能会比不分割时还要差。
    

    17.拆分大的DELETE和INSERT

     如果你需要在一个在线的网站上去执行一个大的DELETE和INSERT查询,你需要非常小心,要避免你的操作让整个网站停止相应。因为这两个操作会锁表,表一锁住,别的操作都不会进来。<br />        处理方法:使用limit条件,每次限定多少条操作。mybatisplus中saveBatchById(list)默认1k条,JDBC批量执行时,URL字符串需要新增一个参数**rewriteBatchedStatements=true**。
    

    18.越小的列会越快

     对于数据引擎来说,硬盘操作可能是最大的瓶颈了。所以把数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问。<br />        一个表只有几列(字典表、配置表),就不会使用int来做主键,使用TINYINT、SMALLINT、MEDIUMINT会好一些。
    

    19.选择正确的引擎

     在Mysql中有两个引擎MySIAM和InnoDB,每个引擎都有利有弊。<br />        MySIAM适合一些需要大量的查询的应用,但其对于有大量写操作并不是很好,并且不支持事务。甚至于你只进行update一个字段,整个表都会被锁起来,而别的进程,就算是读进行都无法操作直到读操作完成。<br />        InnoDB支持行锁、事务。在写操作比较多的时候,会更优秀。