select {weibo1.*}, {weibo2.*} ,{user1.*} ,{user2.*} from t_weibo weibo1 "+
"left join t_weibo weibo2 on weibo1.parent_wbid=weibo2.wbid "+
"left join t_user  user1 on weibo1.weibo_uid=user1.uid "+
"left join t_user  user2 on weibo2.weibo_uid=user2.uid "+
" where  weibo1.weibo_uid="+weiboUid+" order by weibo1.wbid desc"这样的查询如果数据上十万或百万的时候会不会直接搞崩溃程序?一般的mysql连接查询制约其性能的条件有哪些?求优化方案!坐等高手,谢谢!

解决方案 »

  1.   

    是这样的,手册上有写的。
    left join原则是,尽可能on来缩小范围,再在where中控制查找
      

  2.   

    MYSQL中优化需要考虑很多因素点。 一般是先从 explain select ... 查起,然后逐步设计优化方案。
    第7章:优化
    目录7.1. 优化概述
    7.1.1. MySQL设计局限与折衷
    7.1.2. 为可移植性设计应用程序
    7.1.3. 我们已将MySQL用在何处?
    7.1.4. MySQL基准套件
    7.1.5. 使用自己的基准
    7.2. 优化SELECT语句和其它查询
    7.2.1. EXPLAIN语法(获取SELECT相关信息)
    7.2.2. 估计查询性能
    7.2.3. SELECT查询的速度
    7.2.4. MySQL怎样优化WHERE子句
    7.2.5. 范围优化
    7.2.6. 索引合并优化
    7.2.7. MySQL如何优化IS NULL
    7.2.8. MySQL如何优化DISTINCT
    7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN
    7.2.10. MySQL如何优化嵌套Join
    7.2.11. MySQL如何简化外部联合
    7.2.12. MySQL如何优化ORDER BY
    7.2.13. MySQL如何优化GROUP BY
    7.2.14. MySQL如何优化LIMIT
    7.2.15. 如何避免表扫描
    7.2.16. INSERT语句的速度
    7.2.17. UPDATE语句的速度
    7.2.18. DELETE语句的速度
    7.2.19. 其它优化技巧
    7.3. 锁定事宜
    7.3.1. 锁定方法
    7.3.2. 表锁定事宜
    7.4. 优化数据库结构
    7.4.1. 设计选择
    7.4.2. 使你的数据尽可能小
    7.4.3. 列索引
    7.4.4. 多列索引
    7.4.5. MySQL如何使用索引
    7.4.6. MyISAM键高速缓冲
    7.4.7. MyISAM索引统计集合
    7.4.8. MySQL如何计算打开的表
    7.4.9. MySQL如何打开和关闭表
    7.4.10. 在同一个数据库中创建多个表的缺陷
    7.5. 优化MySQL服务器
    7.5.1. 系统因素和启动参数的调节
    7.5.2. 调节服务器参数
    7.5.3. 控制查询优化器的性能
    7.5.4. 编译和链接怎样影响MySQL的速度
    7.5.5. MySQL如何使用内存
    7.5.6. MySQL如何使用DNS
    7.6. 磁盘事宜
    7.6.1. 使用符号链接
    优化是一个复杂的任务,因为最终要求了解整个待优化的系统。尽管可以进行局部优化而不需要了解系统或应用程序,为了优化得更好,你必须知道更多的信息。本章解释并给出不同的优化MySQL的方法示例。但要记住总有一些其它方法使系统更快,尽管需要更多的工作。7.1. 优化概述
    7.1.1. MySQL设计局限与折衷
    7.1.2. 为可移植性设计应用程序
    7.1.3. 我们已将MySQL用在何处?
    7.1.4. MySQL基准套件
    7.1.5. 使用自己的基准
    使一个系统更快的最重要因素当然是基本设计。此外,还需要知道系统正做什么样的事情,以及瓶颈是什么。最常见的系统瓶颈是:磁盘搜索。需要花时间从磁盘上找到一个数据,用在现代磁盘的平均时间通常小于10ms,因此理论上我们能够每秒大约搜索1000次。这个时间在新磁盘上提高不大并且很难为一个表进行优化。优化它的方法是将数据分布在多个磁盘上。 
    磁盘读/写。当磁盘放入正确位置后,我们需要从中读取数据。对于现代的磁盘,一个磁盘至少传输10-20Mb/s的吞吐。这比搜索要容易优化,因为你能从多个磁盘并行地读。 
    CPU周期。我们将数据读入内存后,需要对它进行处理以获得我们需要的结果。表相对于内存较小是最常见的限制因素。但是对于小表,速度通常不成问题。 
    ·         内存带宽。当CPU需要的数据超出CPU缓存时,主缓存带宽就成为内存的一个瓶颈。这在大多数系统正是一个不常见的瓶颈但是你应该知道它。7.1.1. MySQL设计局限与折衷
    当使用MyISAM存储引擎时,MySQL使用极快速的表锁定,以便允许多次读或一次写。使用该存储引擎的最大问题出现在同一个表中进行混合稳定数据流更新与慢速选择。如果这只是某些表的问题,你可以使用另一个存储引擎。参见第15章:存储引擎和表类型。MySQL可以使用事务表和非事务表。为了更容易地让非事务表顺利工作(如果出现问题不能回滚),MySQL采用下述规则。请注意这些规则只适用于不运行在严格模式下或为INSERT或UPDATE使用IGNORE规定程序时。·         所有列有默认值。请注意当运行在严格SQL模式(包括TRADITIONAL SQL模式)时,必须为NOT NULL列指定默认值。·         如果向列内插入不合适的或超出范围的值,MySQL将该列设定为“最好的可能的值”,而不是报告错误。对于数字值,为0、可能的最小值或最大值。对于字符串,为空字符串或列内可以保存的字符串。请注意当运行在严格模式或TRADITIONAL SQL模式时该行为不 适用。·         所有表达式的计算结果返回一个表示错误状况的信号。例如,1/0返回NULL。(使用ERROR_FOR_DIVISION_BY_ZERO SQL模式可以更改该行为)。如果正使用非事务表,不应该使用MySQL来检查列的内容。一般情况,最安全的(通常是最快的)方法径是让应用程序确保只向数据库传递合法值。相关详细信息参见1.8.6节,“MySQL处理约束的方式”和13.2.4节,“INSERT语法”或5.3.2节,“SQL服务器模式”。7.1.2. 为可移植性设计应用程序
    因为不同SQL服务器实现了标准SQL的不同部分
      

  3.   

    直接搞崩溃程序??
    sql是在数据库执行的  怎么会搞崩溃程序呢
      

  4.   

    搜索一个Mysql中文版文档,里面关于优化的方案写的很清楚。
    查询只会很慢,崩溃不会。只要你net_read_timeout这几个timeout设置的长一点,程序应该就没问题。
      

  5.   

    我这访问mysql是用java访问的,如果并发数量过大,然后查询时间过长再加上网络传输方面的消耗,程序挂掉那是轻而易举,但是不知道mysql抗压有多大,没测试过这方面,就拿描述的案例来讲,假如有1000个人同时访问,那么按百万数据算的话,表连接都要匹配上亿次吧?再乘以1000的话,个人估计要杯具,虽然没做过mysql的压力测试
      

  6.   

    看了lzls的回答,只能说事实不是你想的那样