数据库操作导入导出以及加快查询速度

最近做了一个数据查询的工作,需要把Excel文件导入到数据库中在进行查询最终导出。

我之前一直没有重视过数据库方面的学习积累,认为数据库操作只要会写SQL语句就行了,经过这次经历我认为我有必要在数据库技术上下点功夫。

这次遇到的问题就是在数据量非常大的情况下如何通过设计查询语句提高查询速度。

在此之前我处理过的数据很少过万,这次拿到的数据是15W行的数据,最终的结果需要进行自连接操作才能完全得到,我就从导入开始总结。

1.选取合理的导入工具,注意导入过程中遇到的问题

我这次在导入过程中遇到一个困扰我很久的问题:数据导入缺失,一开始我是用Navicat工具导入csv格式的数据,后来才发现数据存在大量丢失,总结起来归结为以下两点:

①字段长度合理设置

Navicat工具默认的varchar字段长度是255,然而在csv文件中有些数据长度超过这个限制,导致这些数据没有成功导入。而且我还忘记设置导入设置了,Navicat默认遇到错误继续执行,结果我没有及时发现问题。

②选取合理的导入工具

修改字段长度限制之后,导入依然遇到错误,大概在导入7W行左右的数据时会报错停止,查来查去原来是Navicat导入工具无法胜任大量数据的导入,大概唱过10W行就不行了,后来换成命令窗口导入问题解决。

2.合理设计查询语句,提高查询效率

①设置索引

因为在查询中用到了自连接,如果不设置索引,数据库全表查询,实际上进行了15W*15W次的查询。如果建立索引,在进行第二次查询时会依据第一次查询建立的索引进行搜索,相当于进行15W次操作,效率就查出来了。我第一次查询没建索引,查询了600S还没结果,中断查询建立索引后200S左右即查询完毕。

索引的设置参考以下:

mysql_建立索引的优缺点

②优化查询语句

即使可以通过建立索引提高查询效率,但是合理的设计查询结构发挥着更重要的作用。

我的查询语句大概是这种的:直接自连接然后查询

1 select * from table1,table 2 on *****

干完活之后一问前辈怎么做的

select [字段2] ((select [字段a] from table1) left join table 2 on ***) 

先从table1中选出想要的值[字段a],在和自身做左外连接。

我的语句查询量:15W*15W

前辈的查询量:([字段a]的数量)*15W

差距就是15W/([字段a]的数量)这么大,我的查询时间一共花费1200S左右,他花了4S。。。。

我知道我有多菜了。。

顺便挂上一个很好的总结:

在一个千万级的数据库查寻中,如何提高查询效率?

原文地址:https://www.cnblogs.com/cxy2016/p/8857866.html