菜鸟的成长之路——mysql对于并发的影响

1.mysql的索引有哪些?

从数据结构角度:
  1. B+树索引:底层结构是B+树结构
  2. hash索引:不能使用范围查询,由于底层是哈希结构,所以检索效率要比B+树高,但是此类索引只存在Memory存储引擎中。
  3. FULLTEXT索引:全文索引,条件格式:MATCH (columnName) AGAINST ('string'),分词查找。结果与期望值往往相差较大,不常使用。
  4. R-Tree索引:空间索引,会从所有维度来索引数据,不常用。
从逻辑角度:
  1. 主键索引:也叫唯一索引,遵守主键约束,即不重复、不为空。和非唯一索引对应。
  2. 非唯一索引:和主键索引对应,不遵守主键约束。
  3. 普通索引:也称作单列索引,和多列索引对应。
  4. 多列索引:和普通索引对应,也叫复合索引,要注意索引顺序,如果只查找多列索引的后面列数据,复合索引是不起作用的。
  5. 空间索引:mysql中的空间类型有:GEOMETRY、POINT、LINESTRING、POLYGON,此索引的列必须是not null,只存在于MYISAM的表中。


创建索引语句:CREATE INDEX indexName ON tableName(columnName);

删除索引语句:DROP INDEX indexName ON tableName;

2.mysql的索引有什么作用?

索引可以让搜索引擎加快对数据的检索,类似于字典的目录。如果我们需要查找某个字的写法,没有目录我们只能从第一页开始往后翻。

但是一旦有了目录,我们通过首字母查找拼音,就很快能找到你想查的这个字了,其实字典的目录更像索引中的hash索引。

B+树索引的底层原理是B+树,是基于二分查找和二叉树优化来的,具体原理不在这里介绍。

索引应该添加在作为sql条件的字段上,但是索引也会有不起作用的时候,一旦碰到这种情况,索引添加只会白白浪费掉mysql的空间和效率,应该考虑优化:

  1. 两个条件是或的关系,其中一个没有索引的时候,索引会失效
  2. 符合索引的第一列没有使用的时候,索引会失效
  3. 使用like并且“%”开头的情况,索引会失效
  4. 索引列和sql字段不一致造成类型转换的时候,索引会失效
  5. 索引列使用函数或者计算的时候,索引会失效
  6. 表中数据量比较小的时候,可能造成索引失效
  7. 索引字段重复数据过多的时候,索引作用太小
  8. 逻辑中不断更新索引字段数据的时候,索引代价太大
  9. 全部都是大小比较的时候,索引作用太小

3.mysql检索一条数据和多条数据有什么区别?

检索数据使用

1.select *

2.select id,name,age...

3.select id

很多博主调研这三种的效率,都发现差别不大,但是实际来说,开发环境有各种不同,例如db和客户端不在一个服务器上,或者网络各种原因,这种问题越大,这三种检索语句效率差别也就越大,总体来说,有下面影响:

  1. select * 会影响mysql优化器对搜索的优化
  2. 增加网络开销
  3. 额外的io、内存和cpu消耗

虽然说这些影响微乎其微,但是还是要注意尽量不要使用“*”来读取数据,这样写并不会减少代码的工作量,而且会增加代码的阅读难度。

4.sql的函数使用和内存中写逻辑哪个效率更高些?

开发过程中,因为合作开发引起了一些思考。

和他们共用一张表,是各自维护自己的逻辑好,还是单独对于这张表作出一些基本操作,然后在此基础上写自己的算法好?

最后选择了将此表基本操作单独抽取出来,作为公共服务,其他人开发在这个服务拿数据,然后进行自己的业务计算。

其实也就是将sql的一些函数和计算放到了java程序里,采用此方案原因如下:

  1. 提高效率:sql中的计算是在硬盘中计算,java程序是在cpu中计算,应该将事情交给更专业的cpu去做。
  2. 易于扩展:这个表多人共同维护,就有可能越来越庞大,最终形成一个服务。分布式的思想提前进入,防止后期项目不好拆分。
  3. 降低耦合:如果一旦出现逻辑的变动,在sql中的计算和函数是有很大局限的,而java各种框架都比较成熟,适合进行逻辑编写。


由此可见,无论从效率上,还是代码扩展角度,都应该选择将逻辑放到程序中,而dao层只做一些基础的增删改查。

5.mysql的引擎有哪些,怎么选择?

mysql中的数据用各种不同的技术存储在文件中,这些技术有着不同的存储机制、索引技巧、锁定水平,因此最终提供不同的功能,也适应不同的场景。

平时数据库的访问权限、处理事务、数据保护都和搜索引擎有关,我们可以通过修改my.ini配置文件来修改我们使用的mysql引擎。

default-storage-engine=InnoDB

修改完重启服务,数据库的默认引擎就修改成了innoDB。

我们也可以通过建表的时候指定type,

create table tableName(

     id int primary key,

     name varchar(50)

) type=MyISAM;

修改此表使用的引擎为MyISAM。

不同的数据库支持的数据库引擎不同,其中有两种经常使用的引擎,分别是:InnoDB和MyIsam。

InnoDB

他是一个事务型的存储引擎,有行级锁和外键约束,select count(*)会进行全表扫描,适用场景如下:

  1. 经常更新的表,适合处理多重并发的更新操作
  2. 支持事务
  3. 可以从灾难中恢复
  4. 外键约束。只有他支持外键(互联网项目多半已经抛弃了外键,不然很难适应复杂的互联网项目的需求)
  5. 支持自动增加列属性

MyIsam

他是mysql的默认引擎,不支持数据库事务的支持,也不支持行级锁和外键,所以插入和更新都需要锁表,效率较低。

  1. 经常查找数据的表
  2. 经常锁表的时候,select count(*) 不需要进行全表扫描
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值