SQL优化总结

1.首先在建表的时候,选用最合适的字段类型。

例如在定义name字段时,可以使用varchar(32),不要使用char(32),以减少不必要的空间;而在定义邮编(邮编固定6位)时也没必要使用varchar(6)了,直接使用char(6)会更好;对于性别,省份等可以定义为enum类型,因为数值型的数据检索速度比文本类型要快;只含数值信息的字段尽量不要设计为字符型。

2.在建表时一些必填的字段设置为not null,这样在以后查询的时候,减少了对null的判断,提高了检索速度。

3.使用外键保证数据的合法性。

如果要在MySQL中使用外键,一定要记住在创建表的时候将表的类型定义为事务安全表InnoDB类型。该类型不是MySQL表的默认类型。定义的方法是在CREATETABLE语句中加上ENGINE=INNODB,简单示例:

DROP TABLE IF EXISTS person;
CREATE TABLE person (
  id int(11) NOT NULL AUTO_INCREMENT,
  name varchar(32) NOT NULL,
  age int(3) DEFAULT 0,
  PRIMARY KEY (id),
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
DROP TABLE IF EXISTS address;
CREATE TABLE address (
  id int(11) NOT NULL AUTO_INCREMENT,
  person_id int(11) NOT NULL,
  address_name varchar(255) NOT NULL,
  PRIMARY KEY (id),
  CONSTRAINT pk_ap FOREIGN KEY (person_id) REFERENCES person (id) ON DELETE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
4.创建索引

一般说来,索引应建立在那些将用于JOIN,WHERE判断和ORDER BY排序的字段上。尽量不要对数据库中某个含有大量重复的值的字段建立索引,索引不是越多越好的。

5.绝大多数情况下,使用索引可以提高查询的速度,但如果SQL语句使用不恰当的话,索引将无法发挥它应有的作用。

(1)应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描(任何在where子句中使用is null或is not null的语句优化器是不允许使用索引的 ),可以在字段上设置默认值,如上述建表中的age字段,在查询的时候就可以使用

select * from person where age = 0;
而不是
select * from person where age is null;

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

select * from person where age<>0;
可替换为
select * from person where age>0;

(3)应尽量避免在 where 子句中使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,将导致引擎放弃使用索引而进行全表扫描,尽量使用union(去除重复,如果不想去除重复,则可使用union all)代替or。

select * from person where age=0 or name='李四';
可替换为
select * from person where age=0
union
select * from person where name='李四';

(4)应尽量避免在 where子句中对字段进行表达式操作,这将导致引擎放弃使用索引而进行全表扫描

select id from t where num/2 = 100 ;
替换为
select id from t where num = 100*2;

6.使用连接json代替子查询

SELECT p.name,p.age
from person p 
where p.id not in (select a.person_id from address a);
可替换为
SELECT p.name,p.age
from person p LEFT JOIN address a on p.id = a.person_id
where a.person_id is null;

7.尽量少的使用in 和not in ,使用exists代替,上例中还可以使用如下代码代替

SELECT p.name,p.age
from person p 
where NOT EXISTS (select 1 from address a where a.person_id = p.id);

8.update语句中更改几个字段写几个字段,不要update全部字段。

9.使用count函数不要count(*),可以写成count(0)。

select count(*) from person;
替换为
select count(0) from person;

10.尽量用具体的字段代替select *。

11.where条件查询的连接顺序:表之间的连接必须写在其他WHERE条件之前, 那些可以过滤掉最大数量记录的条件必须写在WHERE子句的末尾。

猜你喜欢

转载自blog.csdn.net/qq_23543983/article/details/80576139