MySQL笔记

  1. 检索所有列:除非你确定需要表中的每个列,否则最好别使用*通配符。虽然使用通配符可能会使你自己省事,不用明确列出所有列,但检索不需要的列通常会降低检索和应用程序的性能

  2. IN操作符一般比OR操作符清单执行更快,IN操作符最大的优点是可以包含其他SELECT语句,使得能够更动态的建立WHERE子句。IN : WHERE子句中用来指定要匹配值的清单的关键字,功能与OR相当。

  3. COUNT() 函数:有两种使用方式COUNT() 或者COUNT(column) 。两者的区别:COUNT()对所有行计数,不管行中是否有null值。COUNT(column) 指定列计数,计算该列除null之外的不重复行数,为空是也是返回行数。注意:count(distinct col1,col2)如果其中一列全为NULL,那么即使另一列有不同的值,也返回0

  4. MySQL同一张表如果需要自己join自己查询,用自连接而不用子查询。虽然最终结果是相同的,但有时候处理联结远比处理子查询快的多。应该试一下两种方法,已确定哪种性能更好。

  5. 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);

  6. 插入检索出的数据

    INSERT INTO customes(
    cust_id,
    cust_contact)
    SELECT cust_id,cust_contact from custnew
    也可包含WHERE子句以过滤插入的数据

  7. 存储过程基本规范
    注意存储过程内的sql一定要 ; 结束
    也可以通过 DELIMITER 这个关键字定义你想要的分隔符

    创建存储过程:
    DELIMITER  //
    CREATE PROCEDURE test ()
    BEGIN
    SELECT	xxx  FROM  xxxEND //
    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(对存储过程传入和传出)类型的参数。存储过程的代码位于BEGINEND语句内。
    	CALL PROCEDURE test(@pricelow,@pricehigh,@priceavg);
    	该存储过程要求3个参数,所有MySQL变量都必须以@开始。
    
    调用时存储过程不显示任何数据,返回后可以显示,查看返回结果如下;
    select @priceavg;  //获取一个值
    select @pricelow,@pricehigh,@priceavg; //获取三个值
    
    使用INOUT举例
    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;
    
  8. 触发器

    1)只有表才支持触发器,视图不支持(临时表也不支持)。
    	
    (2)触发器按每个表每个事件每次的定义,每个表每个事件每次只允许一个触发器,
        因此,每个表最多支持6个触发器(每条INSERTUPDATEDELETE的之前和之后)。
        单一触发器不能与多个事件或多个表关联,
        所以,如果你需要一个对INSERTUPDATE操作执行的触发器,则应该定义两个触发器。
    
  9. 小数类型为decimal,禁止使用float和double,存在精度损失的问题。

  10. varchar是可变长字符串,不预先分配存储空间,长度不要超过5000,如果村塾长度大于此值,定义字段类型为text,独立出来一张表,用主键来对应,避免影响其他字段索引效率。

  11. 单表行数超过500万行或者单表容量超过2GB,才推荐进行分库分表,如果预计三年后的数据量达不到这个级别,请不要在创建表时就分库分表。

  12. 超过三个表禁止join。需要join的字段,数据类型必须绝对一致;多表关联查询时,保证被关联的字段需要有索引。

  13. 使用ISNULL()来判断是否有NULL值。

  14. 不得使用外键与级联,一切外键概念必须在应用层解决。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。

  15. 禁止使用存储过程,存储过程难以调试和扩展,更没有移植性。

posted @   好事的猫  阅读(24)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 上周热点回顾(2.17-2.23)
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
点击右上角即可分享
微信分享提示