日期:2014-05-16  浏览次数:20789 次

Mysql读语句优化一些好的习惯----yueliangdao0608
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、
第二个,也就是 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、
如果不需要其它字段,当然不要列,这样,只需要处理你需要的字段,至少网络上可以少传不少字节。



------解决方案--------------------
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
#****************************************# 

------解决方案--------------------
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函数,理由同一.导至全表扫描.
--------------------