MySQL笔记
-
检索所有列:除非你确定需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所有列,但检索不需要的列通常会降低检索和应用程序的性能
-
IN操作符一般比OR操作符清单执行更快,IN操作符最大的优点是可以包含其他SELECT语句,使得能够更动态的建立WHERE子句。IN : WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。
-
COUNT() 函数:有两种使用方式COUNT() 或者COUNT(column) 。两者的区别:COUNT()对所有行计数,不管行中是否有null值。COUNT(column) 指定列计数,计算该列除null之外的不重复行数,为空是也是返回行数。注意:count(distinct col1,col2)如果其中一列全为NULL,那么即使另一列有不同的值,也返回0
-
MySQL同一张表如果需要自己join自己查询,用自连接而不用子查询。虽然最终结果是相同的,但有时候处理联结远比处理子查询快的多。应该试一下两种方法,已确定哪种性能更好。
-
MySQL最长使用的引擎为MyISAM和InnoDB,前者支持全文本搜素,而后者不支持。在定义之后MySQL自动维护该索引,在增加、更新或删除行时,索引随之自动更新。可以在创建表时指定FULLTEXT(),或者在稍后指定(在这种情况下所有已有的数据必须立即索引)。不要在导入数据时使用FULLTEXT(),如果正在导入数据到一个新表,此时不应该启用FULLTEXT()索引。应该首先导入所有数据,然后再修改表,定义FULLTEXT()。这样有助于更快的导入主句(而且使索引数据的总时间小于在导入每行时,分别进行索引所需要的总时间)。
全文索引,查询结果按等级降序排列
SELECT note_text FROM productnotes
WHERE Match(note_text) Against(‘anvils’);
扩展查询,增加全文索引的结果范围
SELECT note_text FROM productnotes
WHERE Match(note_text) Against(‘anvils’ WITH QUERY EXPANSION); -
插入检索出的数据
INSERT INTO customes(
cust_id,
cust_contact)
SELECT cust_id,cust_contact from custnew
也可包含WHERE子句以过滤插入的数据 -
存储过程基本规范
注意存储过程内的sql一定要 ; 结束
也可以通过 DELIMITER 这个关键字定义你想要的分隔符创建存储过程: DELIMITER // CREATE PROCEDURE test () BEGIN SELECT xxx FROM xxx ; END // DELIMITER ; 调用存储过程 CALL test(); 删除存储过程 DROP PROCEDURE test; (注意:删除存储过程后面没有(),只给出存储过程名) 使用参数 CREATE PROCEDURE test( OUT pl DECIMAL(8,2), OUT ph DECIMAL(8,2), OUT pa DECIMAL(8,2)) BEGIN SELECT MIN(price) INTO pl FROM product; SELECT MAX(price) INTO ph FROM product; SELECT AVG(price) INTO pa FROM product; END; 关键字OUT 指出相应的参数用来从存储过程传出一个值(返给调用者)。MySQL支持IN(传递给存储过程)、OUT(从存储过程传出,如这里所用)和INOUT(对存储过程传入和传出)类型的参数。存储过程的代码位于BEGIN和END语句内。 CALL PROCEDURE test(@pricelow,@pricehigh,@priceavg); 该存储过程要求3个参数,所有MySQL变量都必须以@开始。 调用时存储过程不显示任何数据,返回后可以显示,查看返回结果如下; select @priceavg; //获取一个值 select @pricelow,@pricehigh,@priceavg; //获取三个值 使用IN和OUT举例 CREATE PROCEDURE test( IN number INT, OUT total DECIMAL(8,2) BEGIN SELECT SUM(price*quantity) FROM product WHERE order_num = number INTO total; END; number定义为IN,因为订单号被传入存储过程。total定义为OUT,因为要从存储过程返回合计。INTO使用total存储计算出来的合计。 调用存储过程 CALL test(1231,@total); 显示此合计 SELECT @total;
-
触发器
(1)只有表才支持触发器,视图不支持(临时表也不支持)。 (2)触发器按每个表每个事件每次的定义,每个表每个事件每次只允许一个触发器, 因此,每个表最多支持6个触发器(每条INSERT、UPDATE和DELETE的之前和之后)。 单一触发器不能与多个事件或多个表关联, 所以,如果你需要一个对INSERT和UPDATE操作执行的触发器,则应该定义两个触发器。
-
小数类型为decimal,禁止使用float和double,存在精度损失的问题。
-
varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果村塾长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其他字段索引效率。
-
单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,如果预计三年后的数据量达不到这个级别,请不要在创建表时就分库分表。
-
超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。
-
使用ISNULL()来判断是否有NULL值。
-
不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
-
禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。
本文来自博客园,作者:好事的猫,转载请注明原文链接:https://www.cnblogs.com/BeiJiuGuRen/p/15828580.html
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)