1. 首页
  2. 中国

通过数据库生成网页

如何通过优化sql语句提高数据库查询效率?谢邀!通过SQL调优提高查询性能最重要的就是对索引的使用,下面是对索引使用的一些总结,希望对你有所帮助。MySQL索引对数据检索的性能至

如何通过优化sql语句提高数据库查询效率?

谢邀!

通过SQL调优提高查询性能最重要的就是对索引的使用,下面是对索引使用的一些总结,希望对你有所帮助。

MySQL索引对数据检索的性能至关重要,盲目的增加索引不仅不能带来性能的提升,反而会消耗更多的额外资源。

索引是用于快速查找记录的一种数据结构。索引就像是数据库中数据的目录,数据库在查询时,首先在索引中找到匹配的值,然后根据这个匹配值找到对应的数据行。

聚簇索引的顺序就是数据的物理存储顺序,索引中数据域存储的就是实际的数据,一个表最多只能有一个聚簇索引,适用于查询多行数据,不适用于频繁修改的列,一般在主键上创建。

非聚簇索引顺序与数据物理排列顺序无关,索引中存储的内容为实际数据的地址,适应于查询单行数据。

普通索引,即平时创建的普通索引。

唯一索引,索引所在的列或列组合的值是全表唯一的。

全文索引,MySQL从3.23.23版开始支持全文索引,它查找的是文中的关键词,而不是直接比较索引中的值。

单列索引,在单列上创建的索引。

组合索引,在多个列上创建的索引。

最左前缀查找:where子句中有a、b、c三个查询条件,创建一个组合索引abc(a,b,c),最左前缀的概念是说以组合索引最左边的列a组合成的查询条件,如(a,b,c)、(a,b)、(a,c),这三种情况的查询条件都会使用abc索引,和where子句中a、b、c出现的顺序没关系,可以是where c=? and b=? and a=?,但(b,c)组合不会使用索引,即where c=? and b=?。

哪些列适合创建索引:

1.经常作为查询条件的列;

2.经常作为排序条件的列;

3.经常作为join条件的列;

4.经常被查询的列。

哪些列不适合创建索引:

1.数据频繁被修改的列,数据被修改,索引需要做相应的修改,消耗资源; 2.区分度不是很高的列,如性别,列值重复性太大,索引效果不是很明显; 3.不是经常被作为查询条件、排序条件、连接条件的列。

经验总结:

1.列上进行函数计算将不会使用索引;

2.对于创建索引的列,避免存储NULL,NULL会使索引更加复杂、效率变低,可以使用NOT NULL进行约束;

3.对于模糊查询like '%abc%',将不会使用索引,而like 'abc%'将会使用索引;

4.对于not in、not exists、!=等负向查询将不会使用索引;

5.每次查询只使用一个索引,如果where条件使用了索引,order by将不再使用索引;

6.对于where子句中有多个查询条件的,单列索引的效率不如复合索引,因为查询每次只能使用一个索引;

7.MySQL只对以下操作符才使用索引:<、<=、=、>、>=、between、in,但是需要注意in的范围值不要太多;

8.union all可以使用索引,但本身效率不是很高,不建议使用;

9.列上进行类型转换的将不会使用索引;

10.老版本MySQL对OR条件不使用索引,新版本才支持,不建议使用OR。

关于索引的实战经验总结后续还会不断更新,可以关注我的头条号!

spring中为什么是通过连接获取操作数据库的对象?

数据库作为一个提供了强大的关系型持久存储和查找的数据模型,通常操作数据库需要使用专门的结构化语言(SQL)进行操作,而连接不同的数据库(oracle,mysql,sqlserver等)所需要注册的驱动都不同,导致其他语言连接数据库存在困难!

而JAVA中抽象了一组连接数据库的接口和类,jdbc(JAVA database connectivity)专门为不同的数据库提供统一的标准进行连接,可以说无论连接数据库的框架怎么封装,底层都是使用的java jdbc!

下面看下jdbc连接数据库的步骤:

①,注册驱动:不同的数据库提供商会提供不同的驱动类进行注册使用,通常使用JNDI反射的方式进行,eg: Class.forName("com.mysql.jdbc.Driver");

②,创建连接:包括数据库连接地址,库,用户名和密码用于连接数据库服务并进行认证,eg:Connection connection = DriverManager.getConnection(x,x,x);

③,执行SQL:创建statement对象,获取执行sql的实例,调用SQL的执行方法!eg:Statement s =connnection.createStatement();s.excuteQuery("select * fron t");

④,组装结果:statement中执行方法会得到相应的返回值,使用resultSet进行接受后处理数据!eg:ResultSet r=s.excuteQuery();

String name =r.getString("name");

⑤,关闭连接:至关重要的一步,因为像oracle就是根据连接时间进行收费的,如果一直开着连接,破产指日可待!connection.close();

上面提到了,任何其他的JAVA框架(mybatis,hibenate,springTemplate等)基本都是封装了原生的jdbc进行操作数据库,所以免不了上诉几个步骤!

我们看到,对于数据库驱动注册,连接开启和关闭这些与业务无关的东西其实并不是开发者关心的,所以进一步的封装很有必要!

spring是怎么进行封装的呢?

1,封装驱动注册和连接:spring通过dbcp等数据源实现包,只需要配置数据库驱动信息,连接信息等就可以实现自动注册和连接数据库,并通过配置destroy-method =true就可以在自动关闭连接!

2,提供jdbcTemplate更为丰富的API,实现更加简便的开发流程,包括增删改查,batch处理等!

如下面代码所示:

jdbcTemplate.queryForInt("select count(*) from test");
//2. 查询一行数据并将该行数据转换为Map返回 jdbcTemplate.queryForMap("select * from test where name='name5'");
//3.查询一行任何类型的数据,最后一个参数指定返回结果类型 jdbcTemplate.queryForObject("select count(*) from test", Integer.class);
//4.查询一批数据,默认将每行数据转换为Map jdbcTemplate.queryForList("select

可以说springTemplate的封装十分轻量级,可以用于替代原生jdbc的开发,不过现在大多数企业都是用的mybatis,提供缓存,动态SQL,方便的映射的ORM框架,是值得学习的数据库操作框架,今天的分享就到这,更多的技术分享,敬请关注!!

本文来自投稿,不代表本站立场,如若转载,请注明出处。