这是来自我微x 3.sql语句写得不好-- 4.没有合理使用索引-5.针对SQL语句的优化 --.查询语句中不要使用*--2.尽量减少子查询,使用关联查询(leftjoin,rightjoin,innerjoin)替代--3.减少使用IN或者NOTIN,使用exists,notexists或者关联查询语句替代--4.or的查询尽量用union或者unionall代替 (在确认没有重复数据或者不用剔除重复数据时,unionall会更好)--5.合理的增加冗余的字段(减少表的联接查询)--.增加中间表进行优化(这个主要是在统计报表的场景,后台开定时任务将数据先统计好,尽量不要在查询的时候去统计)--7.建表的时候能使用数字类型的字段就使用数字类型(type,status...),数字类型的字段作为条件查询比字符串的快--8.那些可以过滤掉最大数量记录的条件必须写在WHERE子句的最末尾--9.合理使用like模糊查询、select*fromstudentwherenamelike%姜小鱼%--会造成全表扫描2、select*fromstudentwherenamelike姜小鱼%--不会造成全表扫描 --0.where子句使用!=或操作符优化在where子句中使用!=或操作符,索引将被放弃使用,会进行全表查询SELECTidFROMAWHEREID!=5--会造成全表扫描2SELECTidFROMAWHEREID5ORID5--不会造成全局表描--2.where子句中使用ISNULL或ISNOTNULL的优化在where子句中使用ISNULL或ISNOTNULL判断,索引将被放弃使用,会进行全表查询。、SELECTidFROMAWHEREnumISNULL--会造全表扫描2、SELECTidFROMAWHEREnum=0--优化成num上设置默认值0,确保表中num没有null--3.where子句使用or的优化很多时候使用unionall或nuin(必要的时候)的方式替换“or”会得到更好的效果。where子句中使用了or,索引将被放弃使用。.SELECTidFROMAWHEREnum=0ornum=20 --索引失效2.SELECTidFROMAWHEREnum=0unionallSELECTidFROMAWHEREnum=20--优化后--4.where子句使用IN或NOTIN的优化in和notin也要慎用,否则也会导致全表扫描。 方案一:between替换in.SELECTidFROMAWHEREnumin(selectnumfromb)--会造成全表扫描2.SELECTnumFROMAWHEREnumexists(selectfromBwhereB.num=A.num)--不会造成全表扫描 方案二:exist替换in.SELECTidFROMAWHEREnumin(selectnumfromb)--会造成全表扫描2.SELECTnumFROMAWHEREnumexists(selectfromBwhereB.num=A.num)--不会造成全表扫描 方案三:leftjoin替换in.SELECTidFROMAWHEREnumin(selectnumfromB)--会造成全表扫描2、2.SELECTidFROMALEFTJOINBONA.num=B.num--不会造成全表扫描 --5.where子句中对字段进行表达式操作的优化--不要在where子句中的“=”左边进行函数、算数运算或其他表达式运算,否则系统将可能无法正确使用索引。SELECTidFROMAWHEREnum/2=00--会造成索引失效2SELECTidFROMAWHEREnum=00*2--优化后3SELECTidFROMAWHEREsubstring(name,,3)=abc--会造成索引失效4SELECTidFROMAWHERELIKEabc%--优化后5SELECTidFROMAWHEREdatediff(day,createdate,20--30)=0 --会造成索引失效SELECTidFROMAWHEREcreatedate=20--30andcreatedate20-2- --不会造成索引失效 7.SELECTidFROMAWHEREyear(addate)20 --会造成索引失效8.SELECTidFROMAwhereaddate20-0-0 --不会造成索引失效--使用“临时表”暂存中间结果 --采用临时表暂存中间结果好处: ()避免程序中多次扫描主表,减少程序执行“共享锁”阻塞“更新锁”,减少了阻塞,提高了并发性能。 (2)尽量使用表变量来代替临时表。如果表变量包含大量数据,请注意索引非常有限(只有主键索引)。 (3)避免频繁创建和删除临时表,以减少系统资源的浪费。 (4)尽量避免向客户端返回大数据量,若数据量过大,应考虑相应需求是否合理。 --7.limit分页优化当偏移量特别时,limit效率会非常低SELECTidFROMALIMIT,0--超级快2SELECTidFROMALIMIT90,0--特别慢方法一:selectidfromAorderbyidlimit90,0;--很快,0.04秒就OK。因为用了id主键做索引当然快方法二:selectid,titlefromAwhereid=(selectidfromcollectorderbyidlimit90,)limit0;方法三:selectidfromAorderbyidbetween0and;--8.批量插入优化.INSERTintoperson(name,age)values(A,4)2.INSERTintoperson(name,age)values(B,4)3.INSERTintoperson(name,age)values(C,4) 可优化为:INSERTintoperson(name,age)values(A,4),(B,4),(C,4)--2.尽量不要使用BYRAND()命令--BYRAND()是随机显示结果,这个函数可能会为表中每一个独立的行执行BYRAND()命令,这个会消耗处理器的处理能力。SELECT*FROMAorderbyrand()limit0;--优化之后SELECT*FROMAWHEREid=((SELECTMAX(id)FROMA)-(SELECTMIN(id)FROMA))*RAND()+(SELECTMIN(id)FROMA)LIMIT0--22.排序的索引问题 --Mysql查询只是用一个索引,因此如果where子句中已经使用了索引的话,--那么orderby中的列是不会使用索引的。因此数据库默认排序可以符合要求情况下--不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。--23.尽量用unionall替换union--union和unionall的差异主要是前者需要将两个(或者多个)结果集合并后再进行唯一性过滤操作,--这就会涉及到排序,增加大量的cpu运算,加大资源消耗及延迟。--所以当我们可以确认不可能出现重复结果集或者不在乎重复结果集的时候,尽量使用unionall而不是union--24.避免类型转换--这里所说的“类型转换”是指where子句中出现column字段的类型和传入的参数类型不一致的时候发生的类型转换。--人为的上通过转换函数进行转换,直接导致mysql无法使用索引。如果非要转型,应该在传入参数上进行转换。--例如utime是datetime类型,传入的参数是“20-07-23”,在比较大小时通常是date(utime)"20-07-23",可以优化为utime"20-07-2:00:00"--25.exist代替in SELECT*fromAWHEREidin(SELECTidfromB)SELECT*fromAWHEREidEXISTS(SELECTfromA.id=B.id)--2.索引的分类:--2.2.、单列索引:一个索引只包含单个列,但一个表中可以有多个单列索引。这里不要搞混淆了。--2.2.2、普通索引:MySQL中基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和空值,纯粹为了查询数据更快一点。--2.2.3、唯一索引:索引列中的值必须是唯一的,但是允许为空值,--2.2.4、主键索引:是一种特殊的唯一索引,不允许有空值。(主键约束,就是一个主键索引)--2.3、组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀集合。例如,这里由id、name和age3个字段构成的索引,索引行中就按id/name/age的顺序存放,索引可以索引下面字段组合(id,name,age)、(id,name)或者(id)。如果要查询的字段不构成索引最左面的前缀,那么就不会是用索引,比如,age或者(name,age)组合就不会使用索引查询--2.4、全文索引:全文索引,只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引,介绍了要求,说说什么是全文索引,就是在一堆文字中,通过其中的某个关键字等,就能找到该字段所属的记录行,比如有"你是个大煞笔,二货..."通过大煞笔,可能就可以找到该条记录。这里说的是可能,因为全文索引的使用涉及了很多细节,我们只需要知道这个大概意思。--2.5、空间索引:空间索引是对空间数据类型的字段建立的索引,MySQL中的空间数据类型有四种,GEOMETRY、POINT、LINESTRING、POLYGON。在创建空间索引时,使用SPATIAL关键字。要求,引擎为MyISAM,创建空间索引的列,必须将其声明为NOTNULL。可能跟游戏开发有关。
四、视图
#视图的优势第一,增强数据安全性第二,提高灵活性,操作变简单第三,提高数据的逻辑独立#视图的使用select视图定义列from视图名--删除视图的语法DROPVIEWifEXISTSview_FoodTable;--创建视图,查询菜品名称、菜品类型名称、销量--创建名为view_FoodTable的视图在创建视图view_FoodTable之前,判断视图是否已经存在,存在则将其先删除CREATEVIEWview_FoodTableASSELECTFoodName,FoodTypeName,SalesVolumeFROMFoodTablefinnerjoinFoodTypeTablef2ONf.FoodTypeID=f2.FoodTypeID;#视图的修改这里的所有参数都与创建视图的参数一样。createorreplaceview视图名asselect语句;#视图的查看--查看视图是指查看数据库中已经存在的视图的定义。查看视图必须要有showview的权限。查看视图的几种方法:)describe语句,语法格式:describe视图名称;或者desc视图名称;2)showtablestatus语句,语法格式:showtablestatuslike视图名3)showcreateview语句,语法格式:showcreateview视图名4)查询information_schem数据库下的views表语法格式:select*frominformation_schema.viewswheretable_name=视图名5)SELECT*FROMview_FoodTable--写出创建满足下述要求的视图的SQL语句。查询学生的学号、姓名、课程号、课程名、成绩--创建名为viewstucourse的视图CREATEVIEWview_stu_courseASSelectsno,sname,cno,cname,scoreFromStuMarkssinnerjoinStuInfos2ons.sno=s2.snoinnerjoincourseCons.cno=C.cno--利用刚才建立的视图,完成如下查询:查询考试成绩大于等于90分的学生的姓名、课程名和成绩SELECTsname,cname,scoreFROMview_stu_coursewherescore=90
四、变量事物
#变量的分类一、系统变量#注意:全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认会话级别)全局变量#变量由系统定义,不是用户定义,属于服务器层面--作用域:针对于所有会话(连接)有效,但不能跨重启①查看所有全局变量SHOWGLOBALVARIABLES;②查看满足条件的部分系统变量SHOWGLOBALVARIABLESLIKE%char%;③查看指定的系统变量的值SELECT
global.auto