索引

千万级别的数据库优化

放肆的年华 提交于 2020-02-16 07:19:04
前言 平时在写一些小web系统时,我们总会对mysql不以为然。然而真正的系统易用应该讲数据量展望拓展到千万级别来考虑。因此,今天下午实在是无聊的慌,自己随手搭建一个千万级的数据库,然后对数据库进行一些简单的CRUD来看看大数据情况下的CRUD效率。 结果发现,曾经简单的操作,在数据量大的时候还是会造成操作效率低下的。因此先写下这篇文章,日后不断更新纪录一下自己工作学习到的Mysql优化技巧。 搭建千万级数据库 首先,需要一个测试环境。一开始想到的是写一个SImple JDBC程序然进行简单的数据INSERT。结果发现单线程情况下,每次INSERT了一百多万条的时候效率就变得非常的低下。但是程序也没报OUT MEMORY之类的异常。初步判断应该是单一线程不断的疯狂创建PrepareStatement对象CG没来得及清理造成内存逐渐被吃紧的原因。 后来改进了一下,用多线程的机制。创建十个进程,每个负责一万条数据的插入。这效率一下子提升了好几倍。然而好景不长,很快的Java程序报错:OUT MEMORY。内存溢出了,CG没来得及清理。 这可把我给急的了。插入的太快内存CPU吃紧,插入的太慢又失去了创建测试环境“快”的初衷。后来想了下,既然是要批量插入数据,那么不是可以简单的写一段数据库存储过程吗? 于是,先建立一张测试表,就叫goods表吧。先写sql语句创建表: CREATE

数据库性能优化-1

丶灬走出姿态 提交于 2020-02-16 07:13:29
出处: https://www.cnblogs.com/easypass/archive/2010/12/ 08/1900127.html 1.数据库访问优化法则 要正确的优化SQL,我们需要快速定位能性的瓶颈点,也就是说快速找到我们SQL主要的开销在哪里?而大多数情况性能最慢的设备会是瓶颈点,如下载时网络速度可能会是瓶颈点,本地复制文件时硬盘可能会是瓶颈点,为什么这些一般的工作我们能快速确认瓶颈点呢,因为我们对这些慢速设备的性能数据有一些基本的认识,如网络带宽是2Mbps,硬盘是每分钟7200转等等。因此,为了快速找到SQL的性能瓶颈点,我们也需要了解我们计算机系统的硬件基本性能指标,下图展示的当前主流计算机性能指标数据。 从图上可以看到基本上每种设备都有两个指标: 延时(响应时间):表示硬件的突发处理能力; 带宽(吞吐量):代表硬件持续处理能力。 从上图可以看出,计算机系统硬件性能从高到代依次为: CPU——Cache(L1-L2-L3)——内存——SSD硬盘——网络——硬盘 由于SSD硬盘还处于快速发展阶段,所以本文的内容不涉及SSD相关应用系统。 根据 数据库 知识,我们可以列出每种硬件主要的工作内容: CPU及内存:缓存数据访问、比较、排序、事务检测、SQL解析、函数或逻辑运算; 网络:结果数据传输、SQL请求、远程数据库访问(dblink); 硬盘:数据访问、数据写入

利用SQL索引提高查询速度

流过昼夜 提交于 2020-02-16 07:10:04
1.合理使用索引 索引是 数据库 中重要的 数据结构 ,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的 ISAM 索引结构。 索引的使用要恰到好处,其使用原则如下: 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。 (1)在下面两条select语句中: SELECT * FROM table1 WHERE field1<=10000 AND field1>=0; SELECT * FROM

利用SQL索引提高查询速度

十年热恋 提交于 2020-02-16 07:08:33
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的 ISAM 索引结构。 索引的使用要恰到好处,其使用原则如下: 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而 使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量 数据后,删除并重建索引可以提高查询速度。 (1)在下面两条select语句中: SELECT * FROM table1 WHERE field1<=10000 AND field1>=0; SELECT * FROM table1

数据量太大的情况下,如何优化查询速度?

好久不见. 提交于 2020-02-16 07:05:49
1.合理使用索引 索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用IBM最先提出的ISAM索引结构。索引的使用要恰到好处,其使用原则如下: ●在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。 ●在频繁进行排序或分组(即进行group by或order by操作)的列上建立索引。 ●在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的“性别”列上只有“男”与“女”两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。 ●如果待排序的列有多个,可以在这些列上建立复合索引(compound index)。 ●使用系统工具。如Informix数据库有一个tbcheck工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用tbcheck工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。 2.避免或简化排序 应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素: ●索引中不包括一个或几个待排序的列;

Sql建表和sql语句的注意事项

百般思念 提交于 2020-02-16 07:03:22
建表注意事项: 对于建表大家都不陌生,这里主要说明一下几点注意实现: 1、大数据字段最好剥离出单独的表,以便影响性能 2、使用varchar,代替char,这是因为varchar会动态分配长度,char指定为20,即时你存储字符“1”,它依然是20的长度 3、给表建立主键,看到好多表没主键,这在查询和索引定义上将有一定的影响 4、避免表字段运行为null,如果不知道添加什么值,建议设置默认值,特别int类型,比如默认值为0,在索引查询上,效率立显。 5、建立索引,聚集索引则意味着数据的物理存储顺序,最好在唯一的,非空的字段上建立,其它索引也不是越多越好,索引在查询上优势显著,在频繁更新数据的字段上建立聚集索引,后果很严重,插入更新相当忙。 6、组合索引和单索引的建立,要考虑查询实际和具体模式. SQL语句注意事项: 熟悉SQL的人,都会写SQL语句,但到底效率如何,十万以下的数据量,根本没任何区别,但一些基础性的东西,还是得点滴做起 1、where语句的书写,当有多个查询条件时,sql是按照从右往左的顺序进行执行,也就是说写在最后的条件会最早被执行,这就意味着过滤数据量最多的 添加应该写在最后,这样才能在性能上达到最优 2、join语句,如果A表1000w,B表30条记录,则应该是A join B,sql执行会以B为准去关联A,性能显著 3、表变量和临时表

SQL SERVER全面优化

你说的曾经没有我的故事 提交于 2020-02-16 06:53:05
今天我们从语句的一些优化写法及一些简单优化方法做一个介绍。这对于很多开发人员来说还是很有用的!为了方便阅读给出前文链接: SQL SERVER全面优化-------Expert for SQL Server 诊断系列 http://www.cnblogs.com/double-K/p/5538249.html 首先还是贴出我的座驾      好的语句就像这辆车,跑的又快又帅气!今天这里介绍一些技巧让你可以改装一下自己的车! 重中之重---语句执行顺序 在QQ群和人聊天的时候突然有位群友说:我才知道原来语句走索引是按照select 的字段筛选的! 振振有词,非常肯定!另一个群友反问update呢 ? 看起来很小白的问题,但确实让我很震惊!所以我们先看看语句的执行顺序 如果我没记错这是《SQL SERVER 2005技术内幕--查询》这本书的开篇第一章第一节。书的作者也要让读者首先了解语句是怎么样的一个执行顺序,因为不知道顺序何谈写个好语句? 查询的逻辑执行顺序: (1) FROM < left_table> (2) ON < join_condition> (3) < join_type> JOIN < right_table> (4) WHERE < where_condition> (5) GROUP BY < group_by_list> (6) WITH {cube |

全文检索引擎及工具 Lucene Solr

[亡魂溺海] 提交于 2020-02-16 03:55:22
全文检索引擎及工具 lucence lucence是一个全文检索引擎。 lucence代码级别的使用步骤大致如下: 创建文档(org.apache.lucene.document.Document),并通过Document的add方法为其添加字段(lucence.document.Field) 创建lucence.index.IndexWriter,通过addDocument或addDocuments方法添加构建好的诸多Document 通过close方法关闭IndexWriter 创建索引搜索器lucence.search.IndexSearcher,需要传入索引仓库阅读器(lucenc.index.DirectoryReader)参数 通过search方法在搜索器上执行查询,参数是ucence.search.Query对象,通过查询解析器lucene.queryparser.classic.QueryParser的实例parse(String)方法来构建一个查询,QueryParser实例可以通过new标准解析器lucene.queryparser.flexible.standard.StandardQueryParser得到 中文文本索引构建及查询示例 (以下涉及的是6.4.2版本的lucene) 对中文文本构建索引时,不能使用 StandardAnalyzer

AspNetPager常用属性介绍

南笙酒味 提交于 2020-02-16 03:37:29
AspNetPager常用属性介绍 AlwaysShow 获取或设置一个值,该值指定是否总是显示.默认情况下,当要分页的数据只有一页时,AspNetPager默认会自动危险期而不在页面上显示任何可见内容,将此属性值设为true时,即使总页数只有一页,AspNetPager也将显示分页导航元素. AspNetPager 分页按件,即使要分页的数据只有一页。 CurrentPageButtonPosition 当前页数字按钮在所有数字分页按钮中的位置,可选值为:Beginning(最前)、End(最后)、Center(居中)和Fixed(默认固定) CurrentPageIndex 获取或设置当前显示页的索引。 FirstPageText 获取或设置为第一页按钮显示的文本。 LastPageText 获取或设置为最后一页按钮显示的文本。 NextPageText 获取或设置为下一页按钮显示的文本。 PrevPageText 获取或设置为上一页按钮显示的文本。 PageSize 获取或设置每页显示的项数。(该值获取或设置数据呈现控件每次要显示数据表中的的数据的项数, AspNetPage r根据该值和RecordCount 来计算显示所有数据需要的总页数,即PageCount的值。) PageIndexBoxType:或者或设置页索引框的显示类型

Spring Cloud集成ELK完成日志收集实战(elasticsearch、logstash、kibana)

梦想与她 提交于 2020-02-16 03:09:36
简介 对于日志来说,最常见的需求就是收集、存储、查询、展示,开源社区正好有相对应的开源项目: logstash(收集)、elasticsearch(存储+搜索)、kibana(展示) ,我们将这三个组合起来的技术称之为ELK,所以说ELK指的是Elasticsearch、Logstash、Kibana技术栈的结合。ELK对外作为一个日志管理系统的开源方案,能够可靠和安全地从任何格式的任何来源获取数据,并实时搜索、分析和可视化。 1 Elasticsearch elasticsearch是一个高可扩展的、开源的、全文本搜索和分析的引擎 。它能够近乎实时地存储,检索和分析大量数据,通常用作底层引擎/技术,为具有复杂搜索特性和需求的应用程序提供动力。 elasticsearch的底层是开源库 Lucene。但是,你没法直接用 Lucene,必须自己写代码去调用它的接口。Elastic 是 Lucene 的封装,提供了 REST API 的操作接口,开箱即用。 1.1节点和集群 elasticsearch 本质上是一个分布式数据库,允许多台服务器协同工作,每台服务器可以运行多个 elasticsearch 实例。 单个 elasticsearch 实例称为一个节点(node)。一组节点构成一个集群(cluster) 。 1.2索引(Index) elasticsearch 会索引所有字段