持续更新
索引失效5大原因
- like %开头
- where 中列使用函数
- or 查询中有不是索引列(联合索引)
- 隐式转换
- 最左原则
千万级数据优化4个层级
- sql优化,索引优化
- 加缓存
- 读写分离(提高并发)
- 分库分表
复杂的join查询应该分成多个单个查询
JOIN 多个表,可能导致更多的锁定和堵塞
内网创建连接,发起查询时间是可以不计的,所以不需要关注这个时间。
程序要尽量简单易懂,不应该写过于复杂的sql
join会锁表,所以建议少用
-- 下面2种情况会锁住table2
delete table1 from table1 inner join table2 on table1.id=table2.id …
update tabel1,table2 set table1.name=’feie’ where table1.id=table2.id and table1.id=1;
空值与NULL的区别
空值不一定为空 例如:如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空。结果显示的却是插入记录的当前时间
空值不一定等于空字符
null 和任何值都不相同,所以 null值的判断不能使用'=' 号,使用is null is not null (索引不会失效,一定亲自测试一下)
分页的优化
假如有类似下面分页语句:
SELECT FROM table1 ORDER BY ftime DESC LIMIT 10000,10;
这种分页方式会导致大量的io,因为MySQL使用的是提前读取策略。
推荐分页方式:
SELECT FROM table1 WHERE ftime < last_time ORDER BY ftime DESC LIMIT 10 (传入上一次分页的界值)
内连接
SELECT * FROM table as t1 inner JOIN (SELECT id FROM table ORDER BY time LIMIT 10000,10) as t2 ON t1.id=t2.id
网友评论