1、
SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,
-------------------------------------------------------------------------------
2、
SELECT * FROM Country ,CountryLanguage
WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了
-------------------------------------------------------------------------------
3、
SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
-------------------------------------------------------------------------------
4、
SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白--------------------------------------------------------
5、
SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚
-------------------------------------------------------------------------------
6、
SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
-------------------------------------------------------------------------------
7、
SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段在看yueliangdao0608的Mysql开发与优化的ppt时,看到了上面的sql,所以拿出来请教下

解决方案 »

  1.   

    1、
    第二个,也就是 WHERE d >= '1994-01-01';这个可以使用索引。
    2、
    效率上一样,好坏无法明确说明,这个一直存在争议。3、
    INT的速度会快一些。整数处理起来比字符串快。
    4、
    估计是让加个字段 column_length
    5、
    name LIKE '%de%‘肯定效率不好,但要看需求。至于 name LIKE 'de%' 和 name >= 'de' AND name < 'df‘/ 应该没有明显差距。不过需要做试验以确认。
    6、
    看MYSQL手册中的LIMIT 的作用7、
    如果不需要其它字段,当然不要列,这样,只需要处理你需要的字段,至少网络上可以少传不少字节。
      

  2.   

    1.对于WHERE子句中的任何字段都不允许加函数 因为加函数了会导致 无法使用到索引---- MySQL不支持函数索引,Oracle到支持,但是效率也会低一些
    2.无必要,若是SQL复杂或3或3张以上表关联推荐此写法3.可以使用到索引的,但是输出结果集中该字段会被隐形转换为 字符串了,若是后面再用此字段作ORDER BY等条件就无法继续使用索引了
    4.这个要看设计的字段含义了5.不能这么简单地转换,是未必的... 应该会出问题6.WHERE 1 不影响查询结果或优化器,但这是很多程序员的不良习惯造成的推荐一个PPT给大家参考:http://www.mysqlops.com/2011/05/25/mysql-training-ppt.html
    #****************************************#
    MySQL技术及运维自动化网:www.mysqlops.com新浪微博账号:http://weibo.com/mysqlops
    #****************************************# 
      

  3.   

    老金也来给CSDN添柴加火了,热烈欢迎!
      

  4.   


    能否再给解释下:WHERE 1 不影响查询结果或优化器,但这是很多程序员的不良习惯造成的?我刚才看了limit的作用,
    Mysql说明文档里面这么写的:如果你用LIMIT只选择一些行,当MySQL选择做完整的表扫描
    时,它将在一些情况下使用索引3.可以使用到索引的,但是输出结果集中该字段会被隐形转换为 字符串了,若是后面再用此字段作ORDER BY等条件就无法继续使用索引了  
    这个解释我觉得也许更好点,之前ACMAIN_CHM 说的有道理,但是我之前看过帖子讨论int跟varchar效率问题,跟数据量有很大关系,数据量不大的时候差不多的。
      

  5.   

    where 1个人认为在性能上有没有没区别,只是在程序语言中组合条件方便些,如:$sql = 'select field from tableName';if($a){
    $sql .= ' where a = ' . $a;
    }if($b){
    if($a){
    $sql .= ' and b = ' . $b;
    }else{
    $sql .= ' where b = ' . $b;
    }
    }可以变成
    $sql = 'select field from tableName where 1';if($a){
    $sql .= ' and a = ' . $a;
    }if($b){
    $sql .= ' and b = ' . $b;
    }
      

  6.   

    1、
    SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,在WHERE里用了计算函数,索引将会失效.
    -------------------------------------------------------------------------------
    2、
    SELECT * FROM Country ,CountryLanguage
    WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
    ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了在连接中当然要显式了.如果不显式,有可能在执行计划时就出错.
    -------------------------------------------------------------------------------
    3、
    SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白WHERE子句一般要求与数据库的类型相配.'19' 相当使用了隐式转换.理由同1.
    -------------------------------------------------------------------------------
    4、
    SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白
    column_length 应该是一个字段名.把字段的长度在表里固定化.如果用了LEN函数,理由同一.导至全表扫描.
    --------------------------------------------------------
    5、
    SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
    SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚对前置式的LIKE优化不好的数据库,一般都转为这个形式. name >= 'de' AND name < 'df‘ 
    这里为什么是DF,因为E的下一个字母就是F.
    -------------------------------------------------------------------------------
    6、
    SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
    -------------------------------------------------------------------------------
    7、
    SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段这个没有特别的意思,就是你要显示什么就取什么,别取太多.不过,这个语句不是与前面的有冲突吗? :)
      

  7.   

    SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,万一有数据是“994-01-01”之类的,怎么办?
      

  8.   

    where 1 limit 10  取10条条件是true
    select 列名  必须这样不要用*
    where id=‘id’  字符好 网上传上来的都是字符串直接用
      

  9.   

    3、
    SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
    个人认为把id设定为整数还有个好处,就是可以通过自动增长取得id,类似与oracel中的sequence
      

  10.   

    SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;这个得看数据库id这个字段的类型
    整型: 使用字符串传值则多一层类型转换的消耗字符串: 那就是多从整型到字符串的消耗另外, 如果业务可以用整型表示, 而使用了字符串类型, 是会增加消耗的, 以64位整型, 占8个字节, 而64位的整数表示为字符串有20个字符, 也就是20字节....比较必然是慢的.
      

  11.   

    1、
    第二个,也就是 WHERE d >= '1994-01-01';这个可以使用索引。
    日期类型在数据库内以整数存储,查询的时候会把'1994-01-01'转换成整数,效率高。
    year函数会丧失一定性能,而且会导致索引失效。
      

  12.   


    1、
    SELECT * FROM t WHERE YEAR(d) >= 1994;SELECT * FROM t WHERE d >= '1994-01-01';//这个好,相比上面的语句没有用year函数,
    //这个我还真没这样用过,学习了
    -------------------------------------------------------------------------------
    2、
    SELECT * FROM Country ,CountryLanguage
    WHERE Country.Code= CountryLanguage.CountryCode;SELECT * FROM Country JOIN CountryLanguage
    ON Country.Code= CountryLanguage.CountryCode;//这个好,显式说明了连接关系,以前好像在哪里看到过,记不起来了
    //我一般都用第二种,如果表多的话第一种的可读性很差。
    -------------------------------------------------------------------------------
    3、
    SELECT * FROM t WHERE id = ‘19’;SELECT * FROM t WHERE id = 19;//id 设置成int类型的要比char或者archar的好?不是很明白
    //这个我用第1种,因为我一直担心如果19没取到值的话就会变成id = ,而字符串则会变成id = ''
    第一个就会保存,第二个就没有记录显示。
    -------------------------------------------------------------------------------
    4、
    SELECT * FROM t WHERE length(column_t) = 5;SELECT * FROM t WHERE column_length=5; //这个也不明白//不解释
    --------------------------------------------------------
    5、
    SELECT * FROM t WHERE name LIKE '%de%‘SELECT * FROM t WHERE name LIKE 'de%'
    SELECT * FROM t WHERE name >= 'de' AND name < 'df‘//将like查询改成非like查询?具体例子什么意思不清楚
    //又学习了,没想到还有第3种写法。
    -------------------------------------------------------------------------------
    6、
    SELECT * FROM t WHERE 1;SELECT * FROM t WHERE 1 LIMIT 10;这个也不懂
    1其实代表TRUE,我一般用TRUE表示
    -------------------------------------------------------------------------------
    7、
    SELECT * FROM Country WHERE Name LIKE 'M%';SELECT Name FROM Country WHERE Name LIKE 'M%';//只取需要的字段
    //比较懒,一直用*号代替,除非涉及的表太多了。
      

  13.   

    推荐一个PPT给大家参考:http://www.mysqlops.com/2011/05/25/mysql-training-ppt.html
      

  14.   

    讲得很好,顶一个test_content1111