前言
提升自己的眼界交往更多同好
有时候圈子很重要,就像上学期间大家都会发现班里有这样一类学生不怎么听课,但是就是学习好。那假如让他回家呆着,不能在课堂里呢?类似的圈子还有;图书馆、网吧、车友群、技术群等等,都可以给你带来同类爱好的人所分享出来的技能或者大家一起烘托出的氛围帮你成长。
有人要问博主为什么要对MySql进行优化呢?
这个问题我该怎么说呢,只要是一个有过中型以上项目开发经验的人都知道,一条MySql执行性能关乎了你的系统的稳定性以及性能。
数据库的四大特征,数据库的隔离级别
首先说一个老生常谈的话题,也是面试最喜欢问的东西,希望博主的分享对现在的你有所帮助!
数据库的四大特征:
数据库的隔离级别:
数据库设计范式:
注:关系实质上是一张二维表,其中每一行是一个元组,每一列是一个属性
第一范式:
第二范式:
第三范式:
例如:
三大范式只是一般设计数据库的基本理念,可以建立冗余较小、结构合理的数据库。如果有特殊情况,就要特殊对待,数据库设计最重要的是看需求跟性能,需求>性能>表结构。所以不能一味的去追求范式建立数据库,各位小伙伴要记牢哦!
✨MySql的优化建议
注意:(尽量减少 SELECT * 的出现下文用到请忽略,用具体的字段列表代替 * 号,不要返回用不到的任何字段,用字段能够大大的节省数据传输量,与数据库的内存使用量哟。)
划重点:
✔一些常见的SQL实践
SELECT * FROM order WHERE order_status!=0 AND order_status !=1
not in/not exists都不是好习惯
|
可以优化为in查询:SELECT * FROM order WHERE order_status IN(1,2,3,4,5)
|
|
MySQL对于IN做了相应的优化,即将IN中的常量全部存储在一个数组里面,而且这个数组是排好序的。但是如果数值较多,产生的消耗也是比较大的。再例如:SELECT id FROM t WHER num IN(1,2,3) 对于连续的数值,能用BETWEEN就不要IN或者使用连接来替换。
|
|
union和union all的差异主要是前者需要将结果集合并后再进行唯一性过滤操作,会涉及到排序,增加大量的CPU运算,加大资源消耗及延迟。union all的前提条件是两个结果集没有重复数据。
|
SELECT * from order WHERE order_desc LIKE '%XX'
|
SELECT * FROM order WHERE order_desc LIKE 'XX%'
|
SELECT * FROM user WHERE user_sex=1 原因:性别只有男,女,每次过滤掉的数据很少,不宜使用索引。
只要能过滤80%数据时就可以使用索引。对于订单状态,如果状态值很少,不宜使用索引,如果状态值很多,能够过滤大量数据,则应该建立索引。
SELECT * FROM order WHERE YEAR(date) < = '2019'
SELECT * FROM order WHERE date < = CURDATE() 或者: SELECT * FROM order WHERE date < = '2019-05-08'
并非周知的SQL实践
SELECT * FROM user WHERE user_id=?
SELECT * FROM user WHERE login_name=?
B-Tree索引的时间复杂度是O(log(n)) Hash索引的时间复杂度是O(1)
单列索引不存null值,复合索引不存全为null的值,如果列允许为null,可能会得到“不符合预期”的结果集 SELECT * FROM user WHERE user_name != 'Chenyongjia' 如果name允许为null,索引不存储null值,结果集中不会包含这些记录。
SELECT * FROM user WHERE login_name=? AND user_passwd=?
SELECT * FROM user WHERE user_passwd=? AND login_name=?
SELECT * FROM user WHERE login_name=?
SELECT * FROM user WHERE user_passwd=?
ENUM保存的是TINYINT,别在枚举中搞一些“中国”“上海”“技术部”这样的字符串,字符串空间又大,效率又低。
小众但非常有用的SQL实践
看累了嘛!别松懈跟着博主继续学习。
SELECT * FROM user WHERE login_name=?
SELECT * FROM user WHERE login_name=? LIMIT 1
|
你知道只有一条结果,但数据库并不知道,明确告诉它,让它主动停止游标移动
|
SELECT * FROM order WHERE date < = CURDATE()
curDate=date(′Y−m−d′);curDate = date('Y-m-d');curDate=date(′Y−m−d′);res = mysql_query( 'SELECT * FROM order WHERE date < = $curDate');
释放了数据库的CPU
SELECT * FROM user WHERE user_phone=15638589820
注意:以上SQL语句尽量全部用大写不要问我为什么哈哈!
❤MySQL无法使用索引的情况总结
总结:
- 关于MySql的优化需要各位小伙伴们在实际开发过程中去运用去总结。
- 希望各位小伙伴站在前人的肩膀上可以走的更高更远!