zoukankan      html  css  js  c++  java
  • mysql优化

    原文:http://www.jb51.net/article/24392.htm

    Mysql优化:

    建表时:

    1.把ip地址存成unsigned int

    2.固定长度的表会更快

    固定长度的表会提高性能,因为MySQL搜寻得会更快一些,因为这些固定的长度是很容易计算下一个数据的偏移量的,所以读取的自然也会很快。而如果字段不是定长的,那么,每一次要找下一条的话,需要程序找到主键。并且,固定长度的表也更容易被缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间

    3.垂直分割

    “垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的

    4.越小的列会越快

    5.选择正确的存储引擎

    6.为搜索字段建索引

    7.为没一张表设置一个int型的id作为主键,varchar类型的主键会很耗性能

    8.使用enum而不是varchar

    Enum类型是非常快和紧凑的,实际上使用的是tinyint类型

    9.Procedure analyse()获取建议

    10.尽可能的使用not null

    Null会占用额外的空间,比较的时候会更复杂

    操作时:

    1.当知道只有一行数据时,使用limit 1

    因为mysql数据引擎会在查找到一条后返回,不会再继续执行

    2.Explain你的select查询

    使用explain关键字可以让你知道mysql是如何处理你的sql语句的,帮你分析的查询语句或是表结构的性能瓶颈,还会告诉你的主键是如何被利用的

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

    大多是mysql服务器的查询缓存都是开启的,是被mysql的数据引擎处理的,当很多相同的查询被执行多次之后,这些查询结果会存放到缓存中,这样,后续相同的查询就不用再操作表直接从缓存中取就行了

    某些查询会让mysql不使用缓存

    // 查询缓存不开启

    $r = mysql_query("SELECT username FROM user WHERE signup_date >= CURDATE()");

    // 开启查询缓存

    $today = date("Y-m-d");

    $r = mysql_query("SELECT username FROM user WHERE signup_date >= '$today'");

    上面两条SQL语句的差别就是 CURDATE() ,MySQL的查询缓存对这个函数不起作用。所以,像 NOW() 和 RAND() 或是其它的诸如此类的SQL函数都不会开启查询缓存,因为这些函数的返回是会不定的易变的。所以,你所需要的就是用一个变量来代替MySQL的函数,从而开启缓存。

    4.在join表的时候使用相当类型的列,并为其建索引

    为两个表的join字段建索引,mysql内部会开启优化join的sql语句的机制;join的字段还应该是相同类型,如果是string类型,字符集必须相同,否则mysql无法使用他们的索引

    5.不要order by rand()

    Mysql不得不执行rand()函数,很耗cpu

    6.不要用select *

    从数据库里查询的数据越多,查询速度就会越慢

    7.无缓冲的查询

    正常的情况下,当你在当你在你的脚本中执行一个SQL语句的时候,你的程序会停在那里直到没这个SQL语句返回,然后你的程序再往下继续执行。你可以使用无缓冲查询来改变这个行为。

    关于这个事情,在PHP的文档中有一个非常不错的说明: mysql_unbuffered_query() 函数:

    “mysql_unbuffered_query() sends the SQL query query to MySQL without automatically fetching and buffering the result rows as mysql_query() does. This saves a considerable amount of memory with SQL queries that produce large result sets, and you can start working on the result set immediately after the first row has been retrieved as you don't have to wait until the complete SQL query has been performed.”

    上面那句话翻译过来是说,mysql_unbuffered_query() 发送一个SQL语句到MySQL而并不像mysql_query()一样去自动fethch和缓存结果。这会相当节约很多可观的内存,尤其是那些会产生大量结果的查询语句,并且,你不需要等到所有的结果都返回,只需要第一行数据返回的时候,你就可以开始马上开始工作于查询结果了。

    然而,这会有一些限制。因为你要么把所有行都读走,或是你要在进行下一次的查询前调用 mysql_free_result() 清除结果。而且, mysql_num_rows() 或 mysql_data_seek() 将无法使用。所以,是否使用无缓冲的查询你需要仔细考虑。

    8.Prepared Statements

    9.拆分大的 DELETE 或 INSERT 语句

  • 相关阅读:
    MySql使用游标Cursor循环(While)更新数据
    初试TinyIoCContainer笔记
    用Razor做静态页面生成器
    在CentOS6.5上安装MariaDB
    mono的远程调试
    mono3.2.3+Jexus5.5+openSuSE13.1的asp.net
    mono3.2和monodevelop4.0在ubuntu12.04上两天的苦战
    第一节知识点:.net与c#的概念
    支付宝支付功能(使用支付宝sdk)
    vs2017/vs2019 去掉 单击aspx文件预览页面
  • 原文地址:https://www.cnblogs.com/shiwaitaoyuan/p/6732496.html
Copyright © 2011-2022 走看看