
在 SQL 语言中,实现事务的提交的语言是 COMMIT REVOKE :废除某用户或某组或所有用户的访问权限。
MySQL 事务主要用于处理 *** 作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你既需要删除人员的基本资料,也要删除和该人员相关的信息。
数据库作为应用开发中必不缺少的基础设施,其性能直接影响应用的整体运行速度。MySQL是目前最广泛使用的关系型数据库之一,对于开发人员写出性能良好的SQL是必备的基本技能之一。下面简单描述下编写SQL的注意事项。
编写高质量的SQL需要从以下几个方面注意,基本原则、表字段注意事项、索引使用注意事项、SQL注意事项。
基本原则
一、尽量不要在数据库里做运算。如果遇到运算尽可能在应用程序层进行计算。
二、控制数据库表数量、控制单表数据量、控制表的字段数。建议单库不要超过四百张表,建议单表字段不要超过五十个,建议单表的数据量不要超过一千万。
三、不要编写大SQL、不要使用大事务。SQL尽量写的简单点拒绝编写大SQL,可以将大SQL拆分成多个小SQL,在应用层聚合。大事务拆分成多个小事务,快速提交。
表字段注意事项
一、选择合适数值字段类型。能用小字段类型的就用小字段类型,如tinyint就比int(1)在表示小数据时合适。
二、能用数字表示就不要用字符。如可以用无符号INT存储IP而不是字符串表示。
三、避免使用NULL字段。原因NULL字段查询优化难,含NULL复合索引失效。
四、少用或拆分TEXT/BLOB字段。字段太大需要更多的空间,性能低下,如需使用拆分到单独表。
五、不要在表字段中存储图片。
索引使用注意事项
一、合理添加索引。索引添加太多会影响更新速度。能够使用复合索引的避免加多个单独索引。
二、字符字段建立前缀索引。
三、不在索引列做运算。索引列做运算会导致索引失效。
四、尽量不使用外建。
SQL类注意事项
一、 SQL语句尽可能简单。大SQL拆分成多个小SQL。
二、事务编写尽量短小。事务即开即用用完立即关闭。
三、尽量不要使用select *。只取需要的列。
四、改写OR为IN或者改写为UNION *** 作。OR在数据量大的时候性能低于IN。
五、避免NOT、!=、>、NOT IN、NOT EXISTS、NOT LIKE等查询。
六、避免%前缀模糊查询。
七、能用UNION ALL不要用UNION。
八、GROUP BY中去除排序。自带排序。
九、同类型的字段做比较。字符类和字符类比较,数值类和数值类比较,不要混在一起比较。
十、尽量单表查询,尽量不要多表关联查询。多表关联查询可以拆分成单表查询在应用程序中聚合数据。
十一、复合索引的多列注意最左原则。
上述注意事项能避免很多性能低下的SQL,希望在开发过程中能引起注意。
大家好,我是Tom哥~
为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于mysql数据库,面试官一般喜欢问哪些问题
接下来,我们逐条来看看每个问题及答案
MyISAM 和 InnoDB 的区别?
答案:InnoDB 支持 事务、外键、聚集索引,通过MVCC来支持高并发,索引和数据存储在一起。InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数。
InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁,并发能力低。MySQL 将默认存储引擎是 InnoDB
mysql 锁有哪些类型?
答案:mysql锁分为共享锁( S lock ) 、排他锁 ( X lock ),也叫做读锁和写锁。根据粒度,可以分为表锁、页锁、行锁。
什么是间隙锁?
答案:间隙锁是可重复读级别下才会有的锁,mysql会帮我们生成了若干 左开右闭 的区间,结合MVCC和间隙锁可以解决幻读问题。
如何避免死锁?
答案:死锁的四个必要条件:1、互斥 2、请求与保持 3、环路等待 4、不可剥夺。
数据库的隔离级别?
答案:读未提交、读已提交、可重复读(mysql的默认级别,每次读取结果都一样,但是有可能产生幻读)、串行化。
Mysql有哪些类型的索引?
答案:
什么是覆盖索引和回表?
答案:
1、覆盖索引,指的是在一次查询中,一个索引包含所有需要查询的字段的值,可能是返回值或where条件
假如我们创建了一个(money,buyer_id)的联合索引,索引的叶子节点包含了 buyer_id 的信息,则不会再 回表 查询。
2、回表,指查询时一些字段值拿不到,需要到主键索引B+树再查一次。
Mysql的最左前缀原则?
答案:即最左优先,在检索数据时从联合索引的最左边开始匹配,直到遇到范围查询(如:>、<、between、like等)
例子:where a = 1 and b = 2 and c >3 and d = 4 ,如果建立(a,b,c,d)组合索引,d是用不到索引的;如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。
线上SQL的调优经验?
答案:
官方为什么建议采用自增id 作为主键?
答案:自增id是连续的,插入过程也是顺序的,总是插入在最后,减少了页分裂,有效减少数据的移动。所以尽量不要使用字符串(如:UUID)作为主键。
索引为什么采用B+树,而不用B-树,红黑树?
答案:提升查询速度,首先要减少磁盘IO次数,也就是要降低树的高度。
事务的特性有哪些?
答案:ACID。
如何实现分布式事务?
答案:
日常工作中,MySQL 如何做优化?
答案:
mysql 主从同步具体过程?
答案:
什么是主从延迟?
答案:指一个写入SQL *** 作在主库执行完后,将数据完整同步到从库会有一个时间差,称之为主从延迟。计算公式:
注意:不同服务器要保持时钟一致
主从延迟排查方法?
答案:通过 show slave status 命令输出的 Seconds_Behind_Master 参数的值来判断
主从延迟要怎么解决?
答案:
如果数据量太大怎么办?
答案:mysql表的数据量一般控制在千万级别,如果再大的话,就要考虑分库分表。除了分表外,列举了面对海量数据业务的一些常见优化手段
分表后ID如何保证全局唯一呢?
答案:分库分表后,多张表共用一套全局id,原来单表主键自增方式满足不了要求。我们需要重新设计一套id生成器。特点:全局唯一、高性能、高可用、方便接入。
分表后可能遇到的哪些问题?
答案:分表后,与单表的最大区别是有分表键 sharding_key ,用来路由具体的物理表,以电商为例,有买家和卖家两个维度,以 buyer_id 路由,无法满足卖家的需求,反之同样道理。如何解决?
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)