1.mysql的索引有哪些?
从数据结构角度:
- B+树索引:底层结构是B+树结构
- hash索引:不能使用范围查询,由于底层是哈希结构,所以检索效率要比B+树高,但是此类索引只存在Memory存储引擎中。
- FULLTEXT索引:全文索引,条件格式:MATCH (columnName) AGAINST ('string'),分词查找。结果与期望值往往相差较大,不常使用。
- R-Tree索引:空间索引,会从所有维度来索引数据,不常用。
从逻辑角度:
- 主键索引:也叫唯一索引,遵守主键约束,即不重复、不为空。和非唯一索引对应。
- 非唯一索引:和主键索引对应,不遵守主键约束。
- 普通索引:也称作单列索引,和多列索引对应。
- 多列索引:和普通索引对应,也叫复合索引,要注意索引顺序,如果只查找多列索引的后面列数据,复合索引是不起作用的。
- 空间索引: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的空间和效率,应该考虑优化:
- 两个条件是或的关系,其中一个没有索引的时候,索引会失效
- 符合索引的第一列没有使用的时候,索引会失效
- 使用like并且“%”开头的情况,索引会失效
- 索引列和sql字段不一致造成类型转换的时候,索引会失效
- 索引列使用函数或者计算的时候,索引会失效
- 表中数据量比较小的时候,可能造成索引失效
- 索引字段重复数据过多的时候,索引作用太小
- 逻辑中不断更新索引字段数据的时候,索引代价太大
- 全部都是大小比较的时候,索引作用太小
3.mysql检索一条数据和多条数据有什么区别?
检索数据使用
1.select *
2.select id,name,age...
3.select id
很多博主调研这三种的效率,都发现差别不大,但是实际来说,开发环境有各种不同,例如db和客户端不在一个服务器上,或者网络各种原因,这种问题越大,这三种检索语句效率差别也就越大,总体来说,有下面影响:
- select * 会影响mysql优化器对搜索的优化
- 增加网络开销
- 额外的io、内存和cpu消耗
虽然说这些影响微乎其微,但是还是要注意尽量不要使用“*”来读取数据,这样写并不会减少代码的工作量,而且会增加代码的阅读难度。
4.sql的函数使用和内存中写逻辑哪个效率更高些?
开发过程中,因为合作开发引起了一些思考。
和他们共用一张表,是各自维护自己的逻辑好,还是单独对于这张表作出一些基本操作,然后在此基础上写自己的算法好?
最后选择了将此表基本操作单独抽取出来,作为公共服务,其他人开发在这个服务拿数据,然后进行自己的业务计算。
其实也就是将sql的一些函数和计算放到了java程序里,采用此方案原因如下:
- 提高效率:sql中的计算是在硬盘中计算,java程序是在cpu中计算,应该将事情交给更专业的cpu去做。
- 易于扩展:这个表多人共同维护,就有可能越来越庞大,最终形成一个服务。分布式的思想提前进入,防止后期项目不好拆分。
- 降低耦合:如果一旦出现逻辑的变动,在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(*)会进行全表扫描,适用场景如下:
- 经常更新的表,适合处理多重并发的更新操作
- 支持事务
- 可以从灾难中恢复
- 外键约束。只有他支持外键(互联网项目多半已经抛弃了外键,不然很难适应复杂的互联网项目的需求)
- 支持自动增加列属性
MyIsam
他是mysql的默认引擎,不支持数据库事务的支持,也不支持行级锁和外键,所以插入和更新都需要锁表,效率较低。
- 经常查找数据的表
- 经常锁表的时候,select count(*) 不需要进行全表扫描