您的位置:首页 > 数据库 > MySQL

MySQL优化

2015-08-01 10:17 148 查看
字段

尽量使用TINYINT、SMALLINT、MEDIUM_INT作为整数类型而非INT,如果非负则加上UNSIGNED。

尽量使用数字型字段,若只含数字信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销。因为引擎在处理查询和连接时会逐个比较字符串中每一个字符,而对于数字型而言只需要比较一次就够了。

VARCHAR的长度只分配真正需要的空间。

使用枚举或整数代替字符串类型。

尽量使用TIMESTAMP,而非DATETIME。

数据类型尽量使用最小的。

MySQL Scheme优化

对表建立索引,有大量重复值、且经常有范围查询(>,<,>=,<=)和group by、order by发生的列,考虑建立索引。

值分布很稀少的字段不适合建索引,例如性别字段。

避免使用!=、<>、IS NULL、IS NOT NULL、IN、NOT IN这样的操作符,这样引擎将放弃使用索引而进行全表扫描。

字符串字段只建前缀索引。

有时,增加列时,先删除索引,之后再加上索引会更快。

为不同的需求选择不同的存储引擎。

查询优化

1.避免对整个表使用count(*),它可能会将整个表锁住。

2.尽量避免在where子句中使用!=或<>,否则引擎将放弃使用索引而进行全表扫描。

3.尽量避免全表扫描,考虑在WHERE、GROUP BY和ORDER BY的列上加上索引。

4.尽量避免在where子句中对字段进行null值判断,否则引擎将放弃使用索引而进行全表扫描。

select id from t where num is null
可以在num上设置默认值0,确保表中num列没有null值,然后这样查询

select id from t where num=0

5.尽量避免在where子句中使用or来连接条件,否则引擎将放弃使用索引而进行全表扫描。

select id from t where num=10 or num=20

可以这样查询

select id from t where num=10
union all
select id from t where num=20

6.下面的查询也将导致全表扫描(不能前置百分号)。

select id from t where name like '%abc%'

若要提高效率,可以考虑全文检索。

7.使用like和通配符时,考虑优化。

select id from t where name like 'MYSQL%'

可以这样查询

select id from t where name>=
'MYSQL' and
name<
'MYSQM'[/code]

8.in和not in也要慎用,否则会导致全表扫描。

select id from t where num in(1,2,3)

对于连续的数值,能用between就不要用in了。

select id from t where num between 1 and 3

9.尽量避免在where子句中对字段进行表达式操作,否则引擎将放弃使用索引而进行全表扫描。

select id from t where num/2=100

应该为

select id from t where num=100*2

10.尽量避免在where子句中对字段进行函数操作,否则引擎将放弃使用索引而进行全表扫描。

select id from t where substring(name,1,3)=’abc’–name以abc开头的id
select id from t where datediff(day,createdate,’2005-11-30′)=0–’2005-11-30′生成的id

应改为

select id from t where name like ‘abc%’
select id from t where createdate>=’2005-11-30′ and createdate<’2005-12-1′

11.不要在where子句中的"="左边进行函数、算数运算或其他表达式运算,否则系统将可能无法正确使用索引。

如果合适,用GROUP BY代替DISTINCT。

LIMIT M,N 在特定场景下会降低查询效率,有节制使用。

使用DROP TABLE,然后再CREATE TABLE,而不是DELETE FROM,以删除表中所有数据。

最小化需要查询的数据,通常来说不要使用*。

限制结果集的行数

使用top

select top 300 cols1,cols2,cols3 from t

增加limit 1会让查询更加高效

引擎发现只有1后停止扫描,而不会进行全表扫描。

高效分页

select * from A limit 100000,10


应改为

select id,name,age from A where id >=(select id from A limit 100000,1) limit 10
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: