mysql优化原则
1.尽量不要在列上运算,这样会导致索引失效
例如:select * from admin where year(admin_time)>2014
优化为: select * from admin where admin_time> '2014-01-01′
2.limit的基数比较大时,使用between and代替
例如:select * from admin order by admin_id limit 100000,10
优化为:select * from admin where admin_id between 100000 and 100010 order by admin_id。
3.使用 JOIN 时候,应该用小的结果驱动大的结果(left join 左边表结果尽量小如果有条件应该放到左边先处理, right join 同理反向),同时尽量把牵涉到多表联合的查询拆分多个 query(多个连表查询效率低,容易到之后锁表和阻塞)。
select * from admin left join log on admin.admin_id = log.admin_id where log.admin_id>10
优化为:select * from (select * from admin where admin_id>10) T1 lef join log on T1.admin_id = log.admin_id。
4.仅列出需要查询的字段,这对速度不会有明显影响,主要考虑节省内存。
例如原句为:
SELECT * FROM Member;
优化为:
SELECT id,name,pwd FROM Member;
5.避免使用NULL。
where 子句中可以对字段进行 null 值判断吗?
可以,比如 select id from t where num is null 这样的 sql 也是可以的。但是最好不要给数据库留NULL,尽可能的使用 NOT NULL 填充数据库。不要以为 NULL 不需要空间,比如:char(100) 型,在字段建立时,空间就固定了, 不管是否插入值(NULL 也包含在内),都是占用 100 个字符的空间的,如果是 varchar 这样的变长字段,null 不占用空间。可以在 num 上设置默认值 0,确保表中 num 列没有 null 值,然后这样查询:select id from t where num= 0。
6.不要使用count(id), 而应该是count( * )。
1.COUNT() 不涉及对具体列的处理:当使用 COUNT() 时,MySQL 不需要考虑具体的列或表达式,它只需统计满足条件的行数。这样可以避免对列进行处理和计算,从而提高计数的效率。
2.COUNT() 可以利用索引:当使用 COUNT() 时,MySQL 可以直接利用已经存在的索引进行计数。因为 COUNT() 不需要关注具体的列或表达式,它只需要扫描索引即可得到满足条件的行数。这样可以减少对数据行的访问,提高计数的速度。
3. COUNT() 的语义更明确:使用 COUNT(*) 可以更清晰地表达对整个行数的计数。它表示计算结果是满足条件的行数,而不是特定列或表达式的计数。
7.使用批量插入语句节省交互。
例如原句为:
INSERT INTO t (id,name) VALUES (1,'a');
INSERT INTO t (id,name) VALUES (2,'b');
INSERT INTO t (id,name) VALUES (3,'c');
优化为:
INSERT INTO t (id,name) VALUES (1,'a'),(2,'b'),(3,'c');