• 关于 数据库索引原理 的搜索结果

回答

索引索引是提高数据库表访问速度的方法。分为聚集索引和非聚集索引。聚集索引:对正文内容按照一定规则排序的目录。非聚集索引:目录按照一定的顺序排列,正文按照另一种顺序排列,目录与正文之间保持一种映射关系。把数据库索引比作字典查询索引,聚集索引就是按照拼音查找,拼音栏中字的顺序就是查找得到的字的顺序。非聚集索引就像按照偏旁部首查找,同是单人旁查到的字所在的页码可能是杂乱的,没有顺序的。存储结构内存中存储的数据是有限的,当需要在磁盘中进行查找时就涉及到了磁盘的 I/O 操作。当磁盘驱动器执行读/写功能时。盘片装在一个主轴上,并绕主轴高速旋转,当磁道在读/写头(又叫磁头) 下通过时,就可以进行数据的读 / 写了。磁盘读取数据是以盘块(block)为基本单位的。位于同一盘块中的所有数据都能被一次性全部读取出来。而磁盘IO代价主要花费在查找时间Ts上。因此我们应该尽量将相关信息存放在同一盘块,同一磁道中。或者至少放在同一柱面或相邻柱面上,以求在读/写信息时尽量减少磁头来回移动的次数,避免过多的查找时间。索引查找时产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的时间复杂度。树高度越小,I/O次数越少。平衡树的高度过深进行多次磁盘IO,导致查询效率低下,而B树和B+树树中每个结点最多含有m个孩子,所以相对平衡树B树和B+树的高度比较低。B树每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。B+树只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。所有非终端节点看成是索引,节点中仅含有其子树根节点最大(或最小)的关键字,不包含查找的有效信息。B+树中所有叶子节点都是通过指针连接在一起。总结:为什么使用B+树?1.文件很大,不可能全部存储在内存中,故要存储到磁盘上2.索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数(为什么使用B-/+Tree,还跟磁盘存取原理有关,具体看下边分析)局部性原理与磁盘预读,预读的长度一般为页(page)的整倍数,(在许多操作系统中,页得大小通常为4k)数据库系统巧妙利用了磁盘预读原理,将一个节点的大小设为等于一个页,这样 每个节点只需要一次I/O 就可以完全载入,(由于节点中有两个数组,所以地址连续)。而红黑树这种结构, h 明显要深的多。由于逻辑上很近的节点(父子)物理上可能很远,无法利用局部性。为什么B+树比B树更适合做索引?1.B+树磁盘读写代价更低B+的内部结点并没有指向关键字具体信息的指针,即内部节点不存储数据。因此其内部结点相对B 树更小。如果把所有同一内部结点的关键字存放在同一盘块中,那么盘块所能容纳的关键字数量也越多。一次性读入内存中的需要查找的关键字也就越多。相对来说IO读写次数也就降低了。2.B+-tree的查询效率更加稳定由于非终结点并不是最终指向文件内容的结点,而只是叶子结点中关键字的索引。所以任何关键字的查找必须走一条从根结点到叶子结点的路。所有关键字查询的路径长度相同,导致每一个数据的查询效率相当。在MySQL中,最常用的两个存储引擎是MyISAM和InnoDB,它们对索引的实现方式是不同的。MyISAM data存的是数据地址。索引是索引,数据是数据。InnoDB data存的是数据本身。索引也是数据。原文地址:https://blog.csdn.net/qq_40180411/article/details/81431386

vamcily 2019-12-02 01:50:31 0 浏览量 回答数 0

回答

使用索引是数据库性能优化的必备技能之一。在MySQL数据库中,有四种索引:聚集索引(主键索引)、普通索引、唯一索引以及我们这里将要介绍的全文索引(FULLTEXT INDEX)。 全文索引(也称全文检索)是目前搜索引擎使用的一种关键技术。它能够利用「分词技术「等多种算法智能分析出文本文字中关键字词的频率及重要性,然后按照一定的算法规则智能地筛选出我们想要的搜索结果。在这里,我们就不追根究底其底层实现原理了,现在我们来看看在MySQL中如何创建并使用全文索引。 在MySQL中,创建全文索引相对比较简单。例如,我们有一个文章表(article),其中有主键ID(id)、文章标题(title)、文章内容(content)三个字段。现在我们希望能够在title和content两个列上创建全文索引,article表及全文索引的创建SQL语句如下: --创建article表 CREATE TABLE article ( id INT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY, title VARCHAR(200), content TEXT, FULLTEXT (title, content) --在title和content列上创建全文索引 ); 上面就是在创建表的同时建立全文索引的SQL示例。此外,如果我们想要给已经存在的表的指定字段创建全文索引,同样以article表为例,我们可以使用如下SQL语句进行创建: --给现有的article表的title和content字段创建全文索引 --索引名称为fulltext_article ALTER TABLE article ADD FULLTEXT INDEX fulltext_article (title, content) 在MySQL中创建全文索引之后,现在就该了解如何使用了。众所周知,在数据库中进行模糊查询是使用LIKE关键字进行查询,例如: SELECT * FROM article WHERE content LIKE '%查询字符串%' 那么,我们使用全文索引也是这样用的吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询。例如,我们想要在article表的title和content列中全文检索指定的查询字符串,可以如下编写SQL语句: SELECT * FROM article WHERE MATCH(title, content) AGAINST('查询字符串') 强烈注意:MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySQL自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。本站将会在后续文章中对Sphinx以及Coreseek进行介绍。 备注1:目前,使用MySQL自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySQL全文索引所能找到的词的默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。 备注2:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。 “答案来源于网络,供您参考” 希望以上信息可以帮到您!

牧明 2019-12-02 02:16:37 0 浏览量 回答数 0

回答

一、基础篇 1.1、Java基础 面向对象的特征:继承、封装和多态 final, finally, finalize 的区别 Exception、Error、运行时异常与一般异常有何异同 请写出5种常见到的runtime exception int 和 Integer 有什么区别,Integer的值缓存范围 包装类,装箱和拆箱 String、StringBuilder、StringBuffer 重载和重写的区别 抽象类和接口有什么区别 说说反射的用途及实现 说说自定义注解的场景及实现 HTTP请求的GET与POST方式的区别 Session与Cookie区别 列出自己常用的JDK包 MVC设计思想 equals与==的区别 hashCode和equals方法的区别与联系 什么是Java序列化和反序列化,如何实现Java序列化?或者请解释Serializable 接口的作用 Object类中常见的方法,为什么wait notify会放在Object里边? Java的平台无关性如何体现出来的 JDK和JRE的区别 Java 8有哪些新特性 1.2、Java常见集合 List 和 Set 区别 Set和hashCode以及equals方法的联系 List 和 Map 区别 Arraylist 与 LinkedList 区别 ArrayList 与 Vector 区别 HashMap 和 Hashtable 的区别 HashSet 和 HashMap 区别 HashMap 和 ConcurrentHashMap 的区别 HashMap 的工作原理及代码实现,什么时候用到红黑树 多线程情况下HashMap死循环的问题 HashMap出现Hash DOS攻击的问题 ConcurrentHashMap 的工作原理及代码实现,如何统计所有的元素个数 手写简单的HashMap 看过那些Java集合类的源码 1.3、进程和线程 线程和进程的概念、并行和并发的概念 创建线程的方式及实现 进程间通信的方式 说说 CountDownLatch、CyclicBarrier 原理和区别 说说 Semaphore 原理 说说 Exchanger 原理 ThreadLocal 原理分析,ThreadLocal为什么会出现OOM,出现的深层次原理 讲讲线程池的实现原理 线程池的几种实现方式 线程的生命周期,状态是如何转移的 可参考:《Java多线程编程核心技术》 1.4、锁机制 说说线程安全问题,什么是线程安全,如何保证线程安全 重入锁的概念,重入锁为什么可以防止死锁 产生死锁的四个条件(互斥、请求与保持、不剥夺、循环等待) 如何检查死锁(通过jConsole检查死锁) volatile 实现原理(禁止指令重排、刷新内存) synchronized 实现原理(对象监视器) synchronized 与 lock 的区别 AQS同步队列 CAS无锁的概念、乐观锁和悲观锁 常见的原子操作类 什么是ABA问题,出现ABA问题JDK是如何解决的 乐观锁的业务场景及实现方式 Java 8并法包下常见的并发类 偏向锁、轻量级锁、重量级锁、自旋锁的概念 可参考:《Java多线程编程核心技术》 1.5、JVM JVM运行时内存区域划分 内存溢出OOM和堆栈溢出SOE的示例及原因、如何排查与解决 如何判断对象是否可以回收或存活 常见的GC回收算法及其含义 常见的JVM性能监控和故障处理工具类:jps、jstat、jmap、jinfo、jconsole等 JVM如何设置参数 JVM性能调优 类加载器、双亲委派模型、一个类的生命周期、类是如何加载到JVM中的 类加载的过程:加载、验证、准备、解析、初始化 强引用、软引用、弱引用、虚引用 Java内存模型JMM 1.6、设计模式 常见的设计模式 设计模式的的六大原则及其含义 常见的单例模式以及各种实现方式的优缺点,哪一种最好,手写常见的单利模式 设计模式在实际场景中的应用 Spring中用到了哪些设计模式 MyBatis中用到了哪些设计模式 你项目中有使用哪些设计模式 说说常用开源框架中设计模式使用分析 动态代理很重要!!! 1.7、数据结构 树(二叉查找树、平衡二叉树、红黑树、B树、B+树) 深度有限算法、广度优先算法 克鲁斯卡尔算法、普林母算法、迪克拉斯算法 什么是一致性Hash及其原理、Hash环问题 常见的排序算法和查找算法:快排、折半查找、堆排序等 1.8、网络/IO基础 BIO、NIO、AIO的概念 什么是长连接和短连接 Http1.0和2.0相比有什么区别,可参考《Http 2.0》 Https的基本概念 三次握手和四次挥手、为什么挥手需要四次 从游览器中输入URL到页面加载的发生了什么?可参考《从输入URL到页面加载发生了什么》 二、数据存储和消息队列 2.1、数据库 MySQL 索引使用的注意事项 DDL、DML、DCL分别指什么 explain命令 left join,right join,inner join 数据库事物ACID(原子性、一致性、隔离性、持久性) 事物的隔离级别(读未提交、读以提交、可重复读、可序列化读) 脏读、幻读、不可重复读 数据库的几大范式 数据库常见的命令 说说分库与分表设计 分库与分表带来的分布式困境与应对之策(如何解决分布式下的分库分表,全局表?) 说说 SQL 优化之道 MySQL遇到的死锁问题、如何排查与解决 存储引擎的 InnoDB与MyISAM区别,优缺点,使用场景 索引类别(B+树索引、全文索引、哈希索引)、索引的原理 什么是自适应哈希索引(AHI) 为什么要用 B+tree作为MySQL索引的数据结构 聚集索引与非聚集索引的区别 遇到过索引失效的情况没,什么时候可能会出现,如何解决 limit 20000 加载很慢怎么解决 如何选择合适的分布式主键方案 选择合适的数据存储方案 常见的几种分布式ID的设计方案 常见的数据库优化方案,在你的项目中数据库如何进行优化的 2.2、Redis Redis 有哪些数据类型,可参考《Redis常见的5种不同的数据类型详解》 Redis 内部结构 Redis 使用场景 Redis 持久化机制,可参考《使用快照和AOF将Redis数据持久化到硬盘中》 Redis 集群方案与实现 Redis 为什么是单线程的? 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级 使用缓存的合理性问题 Redis常见的回收策略 2.3、消息队列 消息队列的使用场景 消息的重发补偿解决思路 消息的幂等性解决思路 消息的堆积解决思路 自己如何实现消息队列 如何保证消息的有序性 三、开源框架和容器 3.1、SSM/Servlet Servlet的生命周期 转发与重定向的区别 BeanFactory 和 ApplicationContext 有什么区别 Spring Bean 的生命周期 Spring IOC 如何实现 Spring中Bean的作用域,默认的是哪一个 说说 Spring AOP、Spring AOP 实现原理 动态代理(CGLib 与 JDK)、优缺点、性能对比、如何选择 Spring 事务实现方式、事务的传播机制、默认的事务类别 Spring 事务底层原理 Spring事务失效(事务嵌套),JDK动态代理给Spring事务埋下的坑,可参考《JDK动态代理给Spring事务埋下的坑!》 如何自定义注解实现功能 Spring MVC 运行流程 Spring MVC 启动流程 Spring 的单例实现原理 Spring 框架中用到了哪些设计模式 Spring 其他产品(Srping Boot、Spring Cloud、Spring Secuirity、Spring Data、Spring AMQP 等) 有没有用到Spring Boot,Spring Boot的认识、原理 MyBatis的原理 可参考《为什么会有Spring》 可参考《为什么会有Spring AOP》 3.2、Netty 为什么选择 Netty 说说业务中,Netty 的使用场景 原生的 NIO 在 JDK 1.7 版本存在 epoll bug 什么是TCP 粘包/拆包 TCP粘包/拆包的解决办法 Netty 线程模型 说说 Netty 的零拷贝 Netty 内部执行流程 Netty 重连实现 3.3、Tomcat Tomcat的基础架构(Server、Service、Connector、Container) Tomcat如何加载Servlet的 Pipeline-Valve机制 可参考:《四张图带你了解Tomcat系统架构!》 四、分布式 4.1、Nginx 请解释什么是C10K问题或者知道什么是C10K问题吗? Nginx简介,可参考《Nginx简介》 正向代理和反向代理. Nginx几种常见的负载均衡策略 Nginx服务器上的Master和Worker进程分别是什么 使用“反向代理服务器”的优点是什么? 4.2、分布式其他 谈谈业务中使用分布式的场景 Session 分布式方案 Session 分布式处理 分布式锁的应用场景、分布式锁的产生原因、基本概念 分布是锁的常见解决方案 分布式事务的常见解决方案 集群与负载均衡的算法与实现 说说分库与分表设计,可参考《数据库分库分表策略的具体实现方案》 分库与分表带来的分布式困境与应对之策 4.3、Dubbo 什么是Dubbo,可参考《Dubbo入门》 什么是RPC、如何实现RPC、RPC 的实现原理,可参考《基于HTTP的RPC实现》 Dubbo中的SPI是什么概念 Dubbo的基本原理、执行流程 五、微服务 5.1、微服务 前后端分离是如何做的? 微服务哪些框架 Spring Could的常见组件有哪些?可参考《Spring Cloud概述》 领域驱动有了解吗?什么是领域驱动模型?充血模型、贫血模型 JWT有了解吗,什么是JWT,可参考《前后端分离利器之JWT》 你怎么理解 RESTful 说说如何设计一个良好的 API 如何理解 RESTful API 的幂等性 如何保证接口的幂等性 说说 CAP 定理、BASE 理论 怎么考虑数据一致性问题 说说最终一致性的实现方案 微服务的优缺点,可参考《微服务批判》 微服务与 SOA 的区别 如何拆分服务、水平分割、垂直分割 如何应对微服务的链式调用异常 如何快速追踪与定位问题 如何保证微服务的安全、认证 5.2、安全问题 如何防范常见的Web攻击、如何方式SQL注入 服务端通信安全攻防 HTTPS原理剖析、降级攻击、HTTP与HTTPS的对比 5.3、性能优化 性能指标有哪些 如何发现性能瓶颈 性能调优的常见手段 说说你在项目中如何进行性能调优 六、其他 6.1、设计能力 说说你在项目中使用过的UML图 你如何考虑组件化、服务化、系统拆分 秒杀场景如何设计 可参考:《秒杀系统的技术挑战、应对策略以及架构设计总结一二!》 6.2、业务工程 说说你的开发流程、如何进行自动化部署的 你和团队是如何沟通的 你如何进行代码评审 说说你对技术与业务的理解 说说你在项目中遇到感觉最难Bug,是如何解决的 介绍一下工作中的一个你认为最有价值的项目,以及在这个过程中的角色、解决的问题、你觉得你们项目还有哪些不足的地方 6.3、软实力 说说你的优缺点、亮点 说说你最近在看什么书、什么博客、在研究什么新技术、再看那些开源项目的源代码 说说你觉得最有意义的技术书籍 工作之余做什么事情、平时是如何学习的,怎样提升自己的能力 说说个人发展方向方面的思考 说说你认为的服务端开发工程师应该具备哪些能力 说说你认为的架构师是什么样的,架构师主要做什么 如何看待加班的问题

徐刘根 2020-03-31 11:22:08 0 浏览量 回答数 0

高校特惠专场

助力学生创业梦,0元体验,快速入门云计算!

回答

优化索引、SQL 语句、分析慢查询; 设计表的时候严格根据数据库的设计范式来设计数据库; 使用缓存,把经常访问到的数据而且不需要经常变化的数据放在缓存中,能 节约磁盘IO; 优化硬件;采用SSD,使用磁盘队列技术(RAID0,RAID1,RDID5)等; 采用MySQL 内部自带的表分区技术,把数据分层不同的文件,能够提高磁 盘的读取效率; 垂直分表;把一些不经常读的数据放在一张表里,节约磁盘I/O; 主从分离读写;采用主从复制把数据库的读操作和写入操作分离开来; 分库分表分机器(数据量特别大),主要的的原理就是数据路由; 选择合适的表引擎,参数上的优化; 进行架构级别的缓存,静态化和分布式; 不采用全文索引; 采用更快的存储方式,例如 NoSQL存储经常访问的数据

茶什i 2019-12-02 03:09:06 0 浏览量 回答数 0

回答

在二叉树中有一种平衡二叉树,通过平衡算法可以让二叉树两边的节点平均分布,这样就能让所有的索引查找都在一个近似的时间内完成。而MySQL这类数据库采用了二叉树的升级版B+Tree的形式,每个节点有三个支叶,不过其算法原理仍然是平衡树的原理。

a123456678 2019-12-02 03:00:39 0 浏览量 回答数 0

问题

【精品问答】Java专业术语50问

游客pklijor6gytpx 2019-12-01 21:56:07 13032 浏览量 回答数 4

问题

【精品问答】初级程序员必备2020最新MYSQL面试题

问问小秘 2020-03-31 13:32:17 1670 浏览量 回答数 1

问题

索引是什么样的原理?

落地花开啦 2019-12-01 19:57:27 844 浏览量 回答数 1

问题

学术界关于HBase在物联网/车联网/互联网/金融/高能物理等八大场景的理论研究

pandacats 2019-12-18 16:06:18 1 浏览量 回答数 0

问题

【Java问答学堂】11期 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?

剑曼红尘 2020-04-29 14:46:02 1 浏览量 回答数 1

问题

你们有没有做 MySQL 读写分离?如何实现 MySQL 的读写分离?【Java问答】44期

剑曼红尘 2020-06-24 08:34:06 8 浏览量 回答数 1

回答

面试题 es 生产集群的部署架构是什么?每个索引的数据量大概有多少?每个索引大概有多少个分片? 面试官心理分析 这个问题,包括后面的 redis 什么的,谈到 es、redis、mysql 分库分表等等技术,面试必问!就是你生产环境咋部署的?说白了,这个问题没啥技术含量,就是看你有没有在真正的生产环境里干过这事儿! 有些同学可能是没在生产环境中干过的,没实际去拿线上机器部署过 es 集群,也没实际玩儿过,也没往 es 集群里面导入过几千万甚至是几亿的数据量,可能你就不太清楚这里面的一些生产项目中的细节。 如果你是自己就玩儿过 demo,没碰过真实的 es 集群,那你可能此时会懵。别懵,你一定要云淡风轻的回答出来这个问题,表示你确实干过这事儿。 面试题剖析 其实这个问题没啥,如果你确实干过 es,那你肯定了解你们生产 es 集群的实际情况,部署了几台机器?有多少个索引?每个索引有多大数据量?每个索引给了多少个分片?你肯定知道! 但是如果你确实没干过,也别虚,我给你说一个基本的版本,你到时候就简单说一下就好了。 es 生产集群我们部署了 5 台机器,每台机器是 6 核 64G 的,集群总内存是 320G。我们 es 集群的日增量数据大概是 2000 万条,每天日增量数据大概是 500MB,每月增量数据大概是 6 亿,15G。目前系统已经运行了几个月,现在 es 集群里数据总量大概是 100G 左右。目前线上有 5 个索引(这个结合你们自己业务来,看看自己有哪些数据可以放 es 的),每个索引的数据量大概是 20G,所以这个数据量之内,我们每个索引分配的是 8 个 shard,比默认的 5 个 shard 多了 3 个 shard。 大概就这么说一下就行了。 往期回顾: 【Java问答学堂】1期 为什么使用消息队列?消息队列有什么优点和缺点?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区别,以及适合哪些场景? 【Java问答学堂】2期 如何保证消息队列的高可用? 【Java问答学堂】3期 如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性? 【Java问答学堂】4期 如何保证消息的可靠性传输?(如何处理消息丢失的问题?) 【Java问答学堂】5期 如何保证消息的顺序性? 【Java问答学堂】6期 如何解决消息队列的延时以及过期失效问题? 【Java问答学堂】7期 如果让你写一个消息队列,该如何进行架构设计? 【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)? 【Java问答学堂】9期 es 写入数据的工作原理是什么啊?es 查询数据的工作原理是什么啊? 【Java问答学堂】10期 es 在数据量很大的情况下(数十亿级别)如何提高查询效率啊?

剑曼红尘 2020-04-29 14:46:13 0 浏览量 回答数 0

回答

如大家所知道的,Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 那么,这几种索引有什么功能和性能上的不同呢? FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。值得一提的是,在数据量较大时候,现将数据放入一个没有全局索引的表中,然后再用CREATE INDEX创建FULLTEXT索引,要比先为一张表建立FULLTEXT然后再将数据写入的速度快很多。 全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。在没有全文索引之前,这样一个查询语句是要进行遍历数据表操作的,可见,在数据量较大时是极其的耗时的,如果没有异步IO处理,进程将被挟持,很浪费时间,当然这里不对异步IO作进一步讲解,想了解的童鞋,自行谷哥。 全文索引的使用方法并不复杂: 创建ALTER TABLE table ADD INDEX FULLINDEX USING FULLTEXT(cname1[,cname2…]); 使用SELECT * FROM table WHERE MATCH(cname1[,cname2…]) AGAINST ('word' MODE ); 其中, MODE为搜寻方式(IN BOOLEAN MODE ,IN NATURAL LANGUAGE MODE ,IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION / WITH QUERY EXPANSION)。 关于这三种搜寻方式,愚安在这里也不多做交代,简单地说,就是,布尔模式,允许word里含一些特殊字符用于标记一些具体的要求,如+表示一定要有,-表示一定没有,*表示通用匹配符,是不是想起了正则,类似吧;自然语言模式,就是简单的单词匹配;含表达式的自然语言模式,就是先用自然语言模式处理,对返回的结果,再进行表达式匹配。 对搜索引擎稍微有点了解的同学,肯定知道分词这个概念,FULLTEXT索引也是按照分词原理建立索引的。西文中,大部分为字母文字,分词可以很方便的按照空格进行分割。但很明显,中文不能按照这种方式进行分词。那又怎么办呢?这个向大家介绍一个Mysql的中文分词插件Mysqlcft,有了它,就可以对中文进行分词,想了解的同学请移步Mysqlcft,当然还有其他的分词插件可以使用。 HASH Hash这个词,可以说,自打我们开始码的那一天起,就开始不停地见到和使用到了。其实,hash就是一种(key=>value)形式的键值对,如数学中的函数映射,允许多个key对应相同的value,但不允许一个key对应多个value。正是由于这个特性,hash很适合做索引,为某一列或几列建立hash索引,就会利用这一列或几列的值通过一定的算法计算出一个hash值,对应一行或几行数据(这里在概念上和函数映射有区别,不要混淆)。在java语言中,每个类都有自己的hashcode()方法,没有显示定义的都继承自object类,该方法使得每一个对象都是唯一的,在进行对象间equal比较,和序列化传输中起到了很重要的作用。hash的生成方法有很多种,足可以保证hash码的唯一性,例如在MongoDB中,每一个document都有系统为其生成的唯一的objectID(包含时间戳,主机散列值,进程PID,和自增ID)也是一种hash的表现。额,我好像扯远了-_-! 由于hash索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。那为什么还需要其他的树形索引呢? 在这里愚安就不自己总结了。引用下园子里其他大神的文章:来自 14的路 的MySQL的btree索引和hash索引的区别 (1)Hash 索引仅仅能满足"=","IN"和"<=>"查询,不能使用范围查询。 由于 Hash 索引比较的是进行 Hash 运算之后的 Hash 值,所以它只能用于等值的过滤,不能用于基于范围的过滤,因为经过相应的 Hash 算法处理之后的 Hash 值的大小关系,并不能保证和Hash运算前完全一样。 (2)Hash 索引无法被用来避免数据的排序操作。 由于 Hash 索引中存放的是经过 Hash 计算之后的 Hash 值,而且Hash值的大小关系并不一定和 Hash 运算前的键值完全一样,所以数据库无法利用索引的数据来避免任何排序运算; (3)Hash 索引不能利用部分索引键查询。 对于组合索引,Hash 索引在计算 Hash 值的时候是组合索引键合并后再一起计算 Hash 值,而不是单独计算 Hash 值,所以通过组合索引的前面一个或几个索引键进行查询的时候,Hash 索引也无法被利用。 (4)Hash 索引在任何时候都不能避免表扫描。 前面已经知道,Hash 索引是将索引键通过 Hash 运算之后,将 Hash运算结果的 Hash 值和所对应的行指针信息存放于一个 Hash 表中,由于不同索引键存在相同 Hash 值,所以即使取满足某个 Hash 键值的数据的记录条数,也无法从 Hash 索引中直接完成查询,还是要通过访问表中的实际数据进行相应的比较,并得到相应的结果。 (5)Hash 索引遇到大量Hash值相等的情况后性能并不一定就会比B-Tree索引高。 对于选择性比较低的索引键,如果创建 Hash 索引,那么将会存在大量记录指针信息存于同一个 Hash 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下。 愚安我稍作补充,讲一下HASH索引的过程,顺便解释下上面的第4,5条: 当我们为某一列或某几列建立hash索引时(目前就只有MEMORY引擎显式地支持这种索引),会在硬盘上生成类似如下的文件: hash值 存储地址 1db54bc745a1 77#45b5 4bca452157d4 76#4556,77#45cc… … hash值即为通过特定算法由指定列数据计算出来,磁盘地址即为所在数据行存储在硬盘上的地址(也有可能是其他存储地址,其实MEMORY会将hash表导入内存)。 这样,当我们进行WHERE age = 18 时,会将18通过相同的算法计算出一个hash值==>在hash表中找到对应的储存地址==>根据存储地址取得数据。 所以,每次查询时都要遍历hash表,直到找到对应的hash值,如(4),数据量大了之后,hash表也会变得庞大起来,性能下降,遍历耗时增加,如(5)。 BTREE BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中,相信学过数据结构的童鞋都对当初学习二叉树这种数据结构的经历记忆犹新,反正愚安我当时为了软考可是被这玩意儿好好地折腾了一番,不过那次考试好像没怎么考这个。如二叉树一样,每次查询都是从树的入口root开始,依次遍历node,获取leaf。 BTREE在MyISAM里的形式和Innodb稍有不同 在 Innodb里,有两种形态:一是primary key形态,其leaf node里存放的是数据,而且不仅存放了索引键的数据,还存放了其他字段的数据。二是secondary index,其leaf node和普通的BTREE差不多,只是还存放了指向主键的信息. 而在MyISAM里,主键和其他的并没有太大区别。不过和Innodb不太一样的地方是在MyISAM里,leaf node里存放的不是主键的信息,而是指向数据文件里的对应数据行的信息. RTREE RTREE在mysql很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找. 各种索引的使用情况 (1)对于BTREE这种Mysql默认的索引类型,具有普遍的适用性 (2)由于FULLTEXT对中文支持不是很好,在没有插件的情况下,最好不要使用。其实,一些小的博客应用,只需要在数据采集时,为其建立关键字列表,通过关键字索引,也是一个不错的方法,至少愚安我是经常这么做的。 (3)对于一些搜索引擎级别的应用来说,FULLTEXT同样不是一个好的处理方法,Mysql的全文索引建立的文件还是比较大的,而且效率不是很高,即便是使用了中文分词插件,对中文分词支持也只是一般。真要碰到这种问题,Apache的Lucene或许是你的选择。 (4)正是因为hash表在处理较小数据量时具有无可比拟的素的优势,所以hash索引很适合做缓存(内存数据库)。如mysql数据库的内存版本Memsql,使用量很广泛的缓存工具Mencached,NoSql数据库redis等,都使用了hash索引这种形式。当然,不想学习这些东西的话Mysql的MEMORY引擎也是可以满足这种需求的。 (5)至于RTREE,愚安我至今还没有使用过,它具体怎么样,我就不知道了。有RTREE使用经历的同学,到时可以交流下! 答案来源于网络

养狐狸的猫 2019-12-02 02:18:32 0 浏览量 回答数 0

问题

ES 生产集群的部署架构是什么?每个索引的数据量大概有多少?【Java问答学堂】29期

剑曼红尘 2020-05-29 20:07:04 0 浏览量 回答数 0

问题

如何设计才可以让系统从未分库分表动态切换到分库分表上?【Java问答】42期

剑曼红尘 2020-06-22 11:05:45 34 浏览量 回答数 1

回答

解决了吗?感觉是版本的问题 ######请问楼主解决了吗?我现在也遇到了相同的问题######这个是由于当时IK分词器还不支持solr5.3版本。现在百度已经能找到solr5.3版本下的ik分词器代码了。######https://github.com/EugenePig/ik-analyzer-solr5   下载这个 然后直接编译 按照reademe 的说明配置即可######基于微博数据检测的Solr实战开发 课程观看地址: http://www.xuetuwuyou.com/course/145 课程出自学途无忧网: http://www.xuetuwuyou.com solrcloud5.2.1+zookeeper一部精通 课程观看地址: http://www.xuetuwuyou.com/course/15 一、课程用到的软件 1.centos6.7 2.apache-tomcat-7.0.47 3.solr-5.5 4.zookeeper 3.4.6 5.eclipse-jee-neon-R-win32-x86_64  二、课程目标 在海量数据的情况下,传统的关系型数据库已经力不从心,快速检索已经成为了应用系统所必备的功能之一。本课程从实战角度出发,让学员能从实战中学习到: 搜索引擎的原理及架构。  掌握在大数据环境下经典检索算法。  掌握如何使用solr实现系统快速检索目标。  掌握solr在开发中常见的技术大坑与调优技术。 三、适用人群 开发人员、架构师、对分布式搜索引擎有兴趣的朋友。 四、课程内容介绍: 第1课、Solr简介与部署     知识点:Solr基本概念以及应用的介绍、Solr单机版的搭建 第2课、Solr建库实战     知识点:介绍managed-schame和solrConfig两大配置文件,并建立Solr库开始实操 第3课、Solr中文分词器与全量数据导入     知识点:对比中文分词器IK与MMSeg4j的特点、Solr配置MMSeg4j中文分词器、把Mysql中的数据导入到Solr索引库上 第4课、Solr增量数据导入及新管理UI实战     知识点:把Mysql的数据增量导入到Solr索引库上、对Solr5最新的UI进行全面介绍 第5课、Solr数据查询详解     知识点:基于UI管理界面,实战Solr q查询、fq查询以及分页、高亮、Facet等高级特性的使用 第6课、Solrj编程实战之索引增删改     知识点:基于Eclipse开发环境、搭建Solrj工程项目,对Solr的索引库的进行增、删、改的操作 第7课、Solrj编程实战之索引查询与分页     知识点:基于Solrj实现q查询、fq查询以及分页查询的操作 第8课、Solrj编程实战之高亮与Facet     知识点:基于Solrj实现高亮查询、Facet查询的操作 第9课、Solrj编程实战之设计模式     知识点:基于前阶段所写的代码,发现代码中的不足,并使用单例模式、模块方法、回调方法的设计模式进行仿Spring Data的开发 第10课、Solr缓存与预热机制剖析     知识点:从算法、应用场景以及实例的多个维度,剖析Solr中的四大缓存,并且站在SolrIndexSearcher的生命周期上解剖预热机制及其注意事项 第11课、Solr高级特性之近实时、实时检索     知识点:从概念、原理以及实例的多个维度,剖析Solr近实时、实时检索 第12课、Solr高级特性之原子更新     知识点:Solr在应用层面上对Lucene进行了封装,在Solr4之后提出了原子更新的新概念,从此在应用层面操作上方便我们进行索引更新 第13课、Solr高级特性之深度分页及性能调优     知识点:Solr4的又一大特性,在面临海量据的情况下,占用更低的资源进行数据检索正是深度分页的一大亮点、后半节结合讲师的实际开发经验,分享Solr性能调优的策略 第14课、SolrCloud部署运维之集群搭建     知识点:基于Centos、zookeeper环境下,搭建SolrCloud系统  第15课、SolrCloud部署运维之库管理     知识点:SolrCloud的运维之道,从UI管理界面以及命令行的两个维度去剖析SolrCloud库的管理,包括库的新增、删除以及动态更新  第16课、SolrCloud部署运维之副本与扩容     知识点:SolrCloud的运维之道,从UI管理界面以及命令行的两个维度去剖析SolrCloud分片的管理,包括分片的备份与库的扩容 第17课、中文分词器配置与使用Solrj操作SolrCloud     知识点:配置中文分词器以及使用Solrj操作SolrCloud来实现增、删、改、查  第18课、项目介绍与环境搭建     知识点:介绍项目的背景以及总体架构、突出Solr在实际项目中的角色。基于Maven搭建开发环境  第19课、框架代码开发之Spring集成Solrj之CRUD(maven版)     知识点:Spring是一个JavaEE企业级框架,它很多主流的主件都进行集成支持。本节学习Spring与Solrj的集成,进行增、删、改、查操作 第20课、框架代码开发之Spring集成Solrj之(maven版)     知识点:Spring是一个JavaEE企业级框架,它对很多主流的组件都进行集成支持。本节学习Spring与Solrj的集成,进行实时检索、高亮、深度分页、Facet查询操作 第21课、基于dom4j的导库组件开发(maven版)     知识点:基于dom4j解析XML文件,并将数据批量高效导入到SolrCloud分布式索引库上进行检索分析 第22课、高级检索组件开发一     知识点:基于SolrCloud实现高级检索,包括多条件查询、高亮、分页操作 第23课、高级检索组件开发二         知识点:基于SolrCloud实现高级检索,包括多条件查询、高亮、分页操作 第24课、相似匹配组件开发一     知识点:基于SolrCloud实现相似性检索操作 第25课、相似匹配组件开发二     知识点:基于SolrCloud实现相似性检索操作 第26课、课程总结与Solr6的展望     知识点:课程大总结,并对最新版的Solr6进行亮点分析以及未来的展望

kun坤 2020-06-01 09:57:39 0 浏览量 回答数 0

回答

简介 ES是一个基于RESTful web接口并且构建在Apache Lucene之上的开源分布式搜索引擎。 同时ES还是一个分布式文档数据库,其中每个字段均可被索引,而且每个字段的数据均可被搜索,能够横向扩展至数以百计的服务器存储以及处理PB级的数据。 可以在极短的时间内存储、搜索和分析大量的数据。通常作为具有复杂搜索场景情况下的核心发动机。 ES就是为高可用和可扩展而生的。一方面可以通过升级硬件来完成系统扩展,称为垂直或向上扩展(Vertical Scale/Scaling Up)。 另一方面,增加更多的服务器来完成系统扩展,称为水平扩展或者向外扩展(Horizontal Scale/Scaling Out)。尽管ES能够利用更强劲的硬件,但是垂直扩展毕竟还是有它的极限。真正的可扩展性来自于水平扩展,通过向集群中添加更多的节点来分担负载,增加可靠性。ES天生就是分布式的,它知道如何管理多个节点来完成扩展和实现高可用性。意味应用不需要做任何的改动。 Gateway,代表ES索引的持久化存储方式。在Gateway中,ES默认先把索引存储在内存中,然后当内存满的时候,再持久化到Gateway里。当ES集群关闭或重启的时候,它就会从Gateway里去读取索引数据。比如LocalFileSystem和HDFS、AS3等。 DistributedLucene Directory,它是Lucene里的一些列索引文件组成的目录。它负责管理这些索引文件。包括数据的读取、写入,以及索引的添加和合并等。 River,代表是数据源。是以插件的形式存在于ES中。  Mapping,映射的意思,非常类似于静态语言中的数据类型。比如我们声明一个int类型的变量,那以后这个变量只能存储int类型的数据。比如我们声明一个double类型的mapping字段,则只能存储double类型的数据。 Mapping不仅是告诉ES,哪个字段是哪种类型。还能告诉ES如何来索引数据,以及数据是否被索引到等。 Search Moudle,搜索模块,支持搜索的一些常用操作 Index Moudle,索引模块,支持索引的一些常用操作 Disvcovery,主要是负责集群的master节点发现。比如某个节点突然离开或进来的情况,进行一个分片重新分片等。这里有个发现机制。 发现机制默认的实现方式是单播和多播的形式,即Zen,同时也支持点对点的实现。另外一种是以插件的形式,即EC2。 Scripting,即脚本语言。包括很多,这里不多赘述。如mvel、js、python等。    Transport,代表ES内部节点,代表跟集群的客户端交互。包括 Thrift、Memcached、Http等协议 RESTful Style API,通过RESTful方式来实现API编程。 3rd plugins,代表第三方插件。 Java(Netty),是开发框架。 JMX,是监控。 使用案例 1、将ES作为网站的主要后端系统 比如现在搭建一个博客系统,对于博客帖子的数据可以直接在ES上存储,并且使用ES来进行检索,统计。ES提供了持久化的存储、统计和很多其他数据存储的特性。 注意:但是像其他的NOSQL数据存储一样,ES是不支持事务的,如果要事务机制,还是考虑使用其他的数据库做真实库。 2、将ES添加到现有系统 有些时候不需要ES提供所有数据的存储功能,只是想在一个数据存储的基础之上使用ES。比如已经有一个复杂的系统在运行,但是现在想加一个搜索的功能,就可以使用该方案。 3、将ES作为现有解决方案的后端部分 因为ES是开源的系统,提供了直接的HTTP接口,并且现在有一个大型的生态系统在支持他。比如现在我们想部署大规模的日志框架、用于存储、搜索和分析海量的事件,考虑到现有的工具可以写入和读取ES,可以不需要进行任何开发,配置这些工具就可以去运作。 设计结构 1、逻辑设计 文档 文档是可以被索引的信息的基本单位,它包含几个重要的属性: 是自我包含的。一篇文档同时包含字段和他们的取值。 是层次型的。文档中还可以包含新的文档,一个字段的取值可以是简单的,例如location字段的取值可以是字符串,还可以包含其他字段和取值,比如可以同时包含城市和街道地址。 拥有灵活的结构。文档不依赖于预先定义的模式。也就是说并非所有的文档都需要拥有相同的字段,并不受限于同一个模式 {   "name":"meeting",   "location":"office",   "organizer":"yanping" } {   "name":"meeting",   "location":{     "name":"sheshouzuo",        "date":"2019-6-28"   },   "memebers":["leio","shiyi"] } 类型 类型是文档的逻辑容器,类似于表格是行的容器。在不同的类型中,最好放入不同的结构的文档。 字段 ES中,每个文档,其实是以json形式存储的。而一个文档可以被视为多个字段的集合。 映射 每个类型中字段的定义称为映射。例如,name字段映射为String。 索引 索引是映射类型的容器一个ES的索引非常像关系型世界中的数据库,是独立的大量文档集合。   关系型数据库与ES的结构上的对比 2、物理设计 节点 一个节点是一个ES的实例,在服务器上启动ES之后,就拥有了一个节点,如果在另一个服务器上启动ES,这就是另一个节点。甚至可以在一台服务器上启动多个ES进程,在一台服务器上拥有多个节点。多个节点可以加入同一个集群。 当ElasticSearch的节点启动后,它会利用多播(multicast)(或者单播,如果用户更改了配置)寻找集群中的其它节点,并与之建立连接。这个过程如下图所示: 节点主要有3种类型,第一种类型是client_node,主要是起到请求分发的作用,类似路由。第二种类型是master_node,是主的节点,所有的新增,删除,数据分片都是由主节点操作(elasticsearch底层是没有更新数据操作的,上层对外提供的更新实际上是删除了再新增),当然也能承担搜索操作。第三种类型是date_node,该类型的节点只能做搜索操作,具体会分配到哪个date_node,就是由client_node决定,而data_node的数据都是从master_node同步过来的 分片 一个索引可以存储超出单个结点硬件限制的大量数据。比如,一个具有10亿文档的索引占据1TB的磁盘空间,而任一节点都没有这样大的磁盘空间;或者单个节点处理搜索请求,响应太慢。   为了解决这个问题,ES提供了将索引划分成多份的能力,这些份就叫做分片。当你创建一个索引的时候,你可以指定你想要的分片的数量。每个分片本身也是一个功能完善并且独立的“索引”,这个“索引”可以被放置到集群中的任何节点上。 分片之所以重要,主要有两方面的原因:   1、允许你水平分割/扩展你的内容容量 允许你在分片(潜在地,位于多个节点上)之上进行分布式的、并行的操作,进而提高性能/吞吐量 至于一个分片怎样分布,它的文档怎样聚合回搜索请求,是完全由ES管理的,对于作为用户的你来说,这些都是透明的。   2、在一个网络/云的环境里,失败随时都可能发生,在某个分片/节点不知怎么的就处于离线状态,或者由于任何原因消失了。这种情况下,有一个故障转移机制是非常有用并且是强烈推荐的。为此目的,ES允许你创建分片的一份或多份拷贝,这些拷贝叫做复制分片,或者直接叫复制。 复制之所以重要,主要有两方面的原因: (1)在分片/节点失败的情况下,提供了高可用性。因为这个原因,注意到复制分片从不与原/主要(original/primary)分片置于同一节点上是非常重要的。 (2)扩展你的搜索量/吞吐量,因为搜索可以在所有的复制上并行运行 总之,每个索引可以被分成多个分片。一个索引也可以被复制0次(意思是没有复制)或多次。一旦复制了,每个索引就有了主分片(作为复制源的原来的分片)和复制分片(主分片的拷贝)之别。分片和复制的数量可以在索引创建的时候指定。在索引创建之后,你可以在任何时候动态地改变复制数量,但是不能改变分片的数量。   默认情况下,ES中的每个索引被分片5个主分片和1个复制,这意味着,如果你的集群中至少有两个节点,你的索引将会有5个主分片和另外5个复制分片(1个完全拷贝),这样的话每个索引总共就有10个分片。一个索引的多个分片可以存放在集群中的一台主机上,也可以存放在多台主机上,这取决于你的集群机器数量。主分片和复制分片的具体位置是由ES内在的策略所决定的。 3、插件HEAD elasticsearch-head是一个界面化的集群操作和管理工具 ● node:即一个 Elasticsearch 的运行实例,使用多播或单播方式发现 cluster 并加入。 ● cluster:包含一个或多个拥有相同集群名称的 node,其中包含一个master node。 ● index:类比关系型数据库里的DB,是一个逻辑命名空间。 ● alias:可以给 index 添加零个或多个alias,通过 alias 使用index 和根据index name 访问index一样,但是,alias给我们提供了一种切换index的能力,比如重建了index,取名● customer_online_v2,这时,有了alias,我要访问新 index,只需要把 alias 添加到新 index 即可,并把alias从旧的 index 删除。不用修改代码。 ● type:类比关系数据库里的Table。其中,一个index可以定义多个type,但一般使用习惯仅配一个type。 ● mapping:类比关系型数据库中的 schema 概念,mapping 定义了 index 中的 type。mapping 可以显示的定义,也可以在 document 被索引时自动生成,如果有新的 field,Elasticsearch 会自动推测出 field 的type并加到mapping中。 ● document:类比关系数据库里的一行记录(record),document 是 Elasticsearch 里的一个 JSON 对象,包括零个或多个field。 ● field:类比关系数据库里的field,每个field 都有自己的字段类型。 ● shard:是一个Lucene 实例。Elasticsearch 基于 Lucene,shard 是一个 Lucene 实例,被 Elasticsearch 自动管理。之前提到,index 是一个逻辑命名空间,shard 是具体的物理概念,建索引、查询等都是具体的shard在工作。shard 包括primary shard 和 replica shard,写数据时,先写到primary shard,然后,同步到replica shard,查询时,primary 和 replica 充当相同的作用。replica shard 可以有多份,也可以没有,replica shard的存在有两个作用,一是容灾,如果primary shard 挂了,数据也不会丢失,集群仍然能正常工作;二是提高性能,因为replica 和 primary shard 都能处理查询。另外,如上图右侧红框所示,shard数和replica数都可以设置,但是,shard 数只能在建立index 时设置,后期不能更改,但是,replica 数可以随时更改。但是,由于 Elasticsearch 很友好的封装了这部分,在使用Elasticsearch 的过程中,我们一般仅需要关注 index 即可,不需关注shard。   shard、node、cluster 在物理上构成了 Elasticsearch 集群,field、type、index 在逻辑上构成一个index的基本概念,在使用 Elasticsearch 过程中,我们一般关注到逻辑概念就好,就像我们在使用MySQL 时,我们一般就关注DB Name、Table和schema即可,而不会关注DBA维护了几个MySQL实例、master 和 slave 等怎么部署的一样。 ES中的索引原理 (1)传统的关系型数据库 二叉树查找效率是logN,同时插入新的节点不必移动全部节点,所以用树型结构存储索引,能同时兼顾插入和查询的性能。因此在这个基础上,再结合磁盘的读取特性(顺序读/随机读),传统关系型数据库采用了B-Tree/B+Tree这样的数据结构做索引 (2)ES 采用倒排索引 那么,倒排索引是个什么样子呢? 首先,来搞清楚几个概念,为此,举个例子: 假设有个user索引,它有四个字段:分别是name,gender,age,address。画出来的话,大概是下面这个样子,跟关系型数据库一样 Term(单词):一段文本经过分析器分析以后就会输出一串单词,这一个一个的就叫做Term Term Dictionary(单词字典):顾名思义,它里面维护的是Term,可以理解为Term的集合 Term Index(单词索引):为了更快的找到某个单词,我们为单词建立索引 Posting List(倒排列表):倒排列表记录了出现过某个单词的所有文档的文档列表及单词在该文档中出现的位置信息,每条记录称为一个倒排项(Posting)。根据倒排列表,即可获知哪些文档包含某个单词。(PS:实际的倒排列表中并不只是存了文档ID这么简单,还有一些其它的信息,比如:词频(Term出现的次数)、偏移量(offset)等,可以想象成是Python中的元组,或者Java中的对象) (PS:如果类比现代汉语词典的话,那么Term就相当于词语,Term Dictionary相当于汉语词典本身,Term Index相当于词典的目录索引) 我们知道,每个文档都有一个ID,如果插入的时候没有指定的话,Elasticsearch会自动生成一个,因此ID字段就不多说了 上面的例子,Elasticsearch建立的索引大致如下: name字段: age字段: gender字段: address字段: Elasticsearch分别为每个字段都建立了一个倒排索引。比如,在上面“张三”、“北京市”、22 这些都是Term,而[1,3]就是Posting List。Posting list就是一个数组,存储了所有符合某个Term的文档ID。 只要知道文档ID,就能快速找到文档。可是,要怎样通过我们给定的关键词快速找到这个Term呢? 当然是建索引了,为Terms建立索引,最好的就是B-Tree索引(MySQL就是B树索引最好的例子)。 我们查找Term的过程跟在MyISAM中记录ID的过程大致是一样的 MyISAM中,索引和数据是分开,通过索引可以找到记录的地址,进而可以找到这条记录 在倒排索引中,通过Term索引可以找到Term在Term Dictionary中的位置,进而找到Posting List,有了倒排列表就可以根据ID找到文档了 (PS:可以这样理解,类比MyISAM的话,Term Index相当于索引文件,Term Dictionary相当于数据文件) (PS:其实,前面我们分了三步,我们可以把Term Index和Term Dictionary看成一步,就是找Term。因此,可以这样理解倒排索引:通过单词找到对应的倒排列表,根据倒排列表中的倒排项进而可以找到文档记录) 为了更进一步理解,用两张图来具现化这一过程: (至于里面涉及的更加高深的数据压缩技巧,以及多个field联合查询利用跳表的数据结构快速做运算来查询,这些大家有兴趣可以自己去了解)

问问小秘 2020-04-29 15:40:48 0 浏览量 回答数 0

问题

HBase高性能随机查询之道 – HFile原理解析

pandacats 2019-12-20 20:57:14 0 浏览量 回答数 0

回答

你缓存的目的是干什么?我感觉你是好几个场景。######回复 @foodon : 上面那只是一个简单的举例而已 主要问题就是在查询列表!######回复 @SandKing : 缓存是为了加快常用功能的速度,但你这几个加到缓存的内容我没弄清作用。我猜想:1、以uid为key缓存用户是为了经需要用户的信息;2、以username为key缓存password是为了登陆;3、这就弄不懂是什么场景了。######缓存的目的 但然是让查询更快啊######没有人么  这么快 就要沉了。。。###### 是这个样子的 缓存的确是要让查询更快,但是缓存主要是为了多次查询的某一条记录做的 比如说99%的用户需要查询第99条记录,那么把这条记录写入缓存是比较好的方案 但是缓存是有局限性的,像你要统计全表有多少的2类用户,这不可以用缓存来做的,因为这里涉及到的记录是全表中的记录,所以你的问题2是不合适的,因为如果要实现这个功能就不要用缓存做 再一个一般缓存应该不是用时间触发超时的,一般是在每次你向缓存中插入一条记录的时候统计当前缓存中的记录条数,如果达到了缓存大小的极限,那么会用一种选择算法把其中的一条记录去掉。记住这里是向缓存中插入记录,不是所有插入记录的情况。对数据库写操作的时候要直接操作数据库的,只有读操作才经过缓存,而且如果是update的话要判断是不是某条记录与缓存中记录不一样了,那样要修改缓存中的记录。其实对于哪些记录要进缓存也是要用算法判断的,选择大多数用户会查询而且一般不修改的是比较好的可以进缓存的记录。 加缓存的问题很多的,建议查oracle数据库缓存的原理。数据库也是有缓存的,一般不用我们来在程序内设置缓存,如果你想要这方面的知识那么看看oracle缓存一些基本的原理吧。 ######如果一个玩家上线 要保证他的所有请求都比较快,所有的请求都不能超过20毫秒 20毫秒中要包括你的业务逻辑+数据查询等等######你说的这种是对要求不是特别高的情况,我们在做游戏的时候你更具用户要查询一个用户的列表什么的。对查询速度要求比较高! 我要做的是查询 全查询缓存 ,插入 更新 同时修改缓存和数据库###### 不建议用缓存,根本就是根据索引查对象。。 没有达到缓存的基本要求。。 ######这样做 比你查询库 快太多太多了######你是做的缓存吗?怎么这么复杂?缓存一个对象不可以吗?不太理解你的需求。###### 你这等于就是把缓存做数据库来用,所以那个超时移除可以去掉了. 至于那些不常用的数据,可以想办法做到要用到时加载,不用时剔除,这块才是你需要设计的地方,比如说针对这种数据启用超时. ######基本上就是这个意思! 用的时候加载OK没问题,不用时剔除这个就会出现我上面说的这个情况了!###### 引用来自“李三乎”的答案 是这个样子的 缓存的确是要让查询更快,但是缓存主要是为了多次查询的某一条记录做的 比如说99%的用户需要查询第99条记录,那么把这条记录写入缓存是比较好的方案 但是缓存是有局限性的,像你要统计全表有多少的2类用户,这不可以用缓存来做的,因为这里涉及到的记录是全表中的记录,所以你的问题2是不合适的,因为如果要实现这个功能就不要用缓存做 再一个一般缓存应该不是用时间触发超时的,一般是在每次你向缓存中插入一条记录的时候统计当前缓存中的记录条数,如果达到了缓存大小的极限,那么会用一种选择算法把其中的一条记录去掉。记住这里是向缓存中插入记录,不是所有插入记录的情况。对数据库写操作的时候要直接操作数据库的,只有读操作才经过缓存,而且如果是update的话要判断是不是某条记录与缓存中记录不一样了,那样要修改缓存中的记录。其实对于哪些记录要进缓存也是要用算法判断的,选择大多数用户会查询而且一般不修改的是比较好的可以进缓存的记录。 加缓存的问题很多的,建议查oracle数据库缓存的原理。数据库也是有缓存的,一般不用我们来在程序内设置缓存,如果你想要这方面的知识那么看看oracle缓存一些基本的原理吧。 呃,你现在做的都是数据库要做的功能啊。数据库本身是有缓存功能的。你们没有数据库工程师么,这些不应该是代码里要考虑的内容啊。你的总的要求就是要快速的进行数据查询,这应该是数据库里存储过程的功能啊。 平时用代码写的话做个小的缓存自己用还可以,要这样大型的用数据库自己来处理是最好的。 如果非要自己做的话,可以借鉴memDB的思路,我们可以在内存中虚拟一个数据库,按照jdbc driver的接口实现存储在内存中的数据库,你可以让一个专门的服务器用来定期把修改写入本地数据库。 这种情况真心不建议自己做缓存

kun坤 2020-06-11 14:01:26 0 浏览量 回答数 0

回答

strong consistency across distributed node not supported 不支持全局强一致 报错信息:strong consistency across distributed node not supported OB版本:  1.x 报错原因: OceanBase 1.x 版本不支全局一致性查询。在1.x版本里,当SQL要查询的数据分布在不同OBServer节点上时,由于没有内置全局时钟,所以无法获取不同OBServer节点上同一个时刻的数据。 解决办法: 1. 在1.x版本里。如果SQL访问的是多个表,且表之间有业务联系,则将多个表设置为相同的表分组(tablegroup)可以规避这个问题;如果SQL访问的是单个分区表,且能接受延时,可以使用弱一致读hint来规避报错;否则,暂时无解。  弱一致读hint详情请参考官方文档 弱一致读(ob_read_consistency) 2. 计划在2.1版本里,支持全局一致性查询,就没有这个问题。 ------------------------- ERROR 4624 (HY000): machine resource is not enough to hold a new unit 报错信息:ERROR 4624 (HY000): machine resource is not enough to hold a new unit OB版本:所有版本 报错原因:     OceanBase从某个角度来说就是将一批机器的资源(CPU/Memory/Disk)聚合在一起形成一个大的“资源池”,然后再从里面分配资源。每个租户都得绑定至少一个Resource Pool。Resource Pool就是从原始的“资源池”里创建出来的。每个Resource Pool由N个相同的Unit组成。每个Unit在某个具体的OBServer内部分配。当创建新的Resource Pool或者调大老的Resource Pool规格时,可能会因为没有OBServer可以分配出对应规格的Unit而报错。 解决办法:     重新计算可用资源,调制分配资源的SQL里的规格。如果可用资源确实不够用,那就先补充机器资源或者释放不用的租户资源,然后再重试。 ------------------------- OceanBase是否开源? 汇总一下有关OceanBase和开源相关的问题的答案。 1. OceanBase 0.4曾经开源,地址为 alibaba/oceanbase 。 喜欢看代码的从中可以学习到一些分布式数据库开发经验。 2. OceanBase从1.0版本不再开源,架构上做了很大的重构,对SQL和存储功能都有加强。不过关于LSM结构、冻结合并的原理没有大变。当前版本进入2.0。将来是否开源目前并无信息。 3. OceanBase 在用户体验上像MySQL,但是绝不是MySQL,也不是基于MySQL版本修改的,不是基于Postgre修改的,不是基于其他任何开源的产品修改的。OceanBase是蚂蚁自主研发的纯粹的分布式数据库,产品开发过程中,特别注意避免侵犯其他公司专利。所以OceanBase是按照一个商业通用数据库去规划设计的。 4. 随时欢迎开发能力很强的同学加入OceanBase内核开发团队。 ------------------------- OceanBase支持分布式事务吗? OceanBase提供多租户能力(租户就是实例)。租户内的分布式事务需求,OceanBase是满足的。原理是两阶段提交协议,强一致。OceanBase对分布式事务两阶段提交过程做了一些优化,性能有提升。如果业务的事务范围超出了租户(实例)的边界,则必须借助第三方分布式事务中间件框架或者应用自己实现分布式事务。蚂蚁SOFA的分布式事务框架DTX支持三种分布式事务方法,即XA、TCC和FMT.其中TCC和FMT都是最终一致。 ------------------------- Q: OceanBase里创建索引是立即生效吗?唯一索引呢?A: 分场景。 如果是在create table里带上了索引(包括唯一索引,也就是唯一性约束),是立即生效的。OB 1.x 版本里在表存在的情况下新建的索引(包括唯一索引),命令立即返回,但是索引不是立即生效。需要等到OB集群发起大合并之后才会生效。其中唯一索引需要等待两次大合并。所以运维建索引后需要安排1-2次大合并操作。OB 2.x 版本里在表存在的情况下新建的索引(包括唯一索引),命令立即返回,索引也不是立即生效,但是索引开始后台异步创建,创建时间取决于数据量。 示例如下: 1. OB 1.x 版本的索引 2. OB 2.x 版本的索引 ------------------------- OceanBase合并触发条件 Q:OceanBase什么时候会触发「合并」? A: OceanBase的数据写之前事务日志redo会及时落盘,但是数据的增量修改会一直在OB的增量内存memtable里,每天会落盘一次,这个就是合并。合并时间可以设定(major_freeze_duty_time)。另外,如果memtable使用率超过阈值(freeze_trigger_percentage),就会触发「冻结」,然后就是minor compaction,以及「转储」操作。转储会释放memtable内存,增量数据被输出到磁盘上,转储有次数限制(最大由参数minor_freeze_times),这个次数用完了就会触发「合并」。合并会比较耗OB的资源,时间长短取决于有多少增量数据要跟基线数据合并。 ## 查看冻结转储参数SHOW parameters WHERE NAME IN ('enable_major_freeze','minor_freeze_times','freeze_trigger_percentage','major_freeze_duty_time') AND svr_ip IN ('11.166.175.6');## 触发冻结合并ALTER system major freeze;SELECT sleep(1);## 查看冻结合并历史SELECT str_to_date(h.gmt_create,'%Y-%m-%d %h:%i:%s') gmt_create, module, EVENT,name1,value1,name2,value2 FROM __all_rootservice_event_history hWHERE h.module IN ('daily_merge','major_freeze', 'root_service')ORDER BY gmt_create DESC LIMIT 50; 示例:

mq4096 2019-12-02 00:40:00 0 浏览量 回答数 0

回答

strong consistency across distributed node not supported 不支持全局强一致 报错信息:strong consistency across distributed node not supported OB版本:  1.x 报错原因: OceanBase 1.x 版本不支全局一致性查询。在1.x版本里,当SQL要查询的数据分布在不同OBServer节点上时,由于没有内置全局时钟,所以无法获取不同OBServer节点上同一个时刻的数据。 解决办法: 1. 在1.x版本里。如果SQL访问的是多个表,且表之间有业务联系,则将多个表设置为相同的表分组(tablegroup)可以规避这个问题;如果SQL访问的是单个分区表,且能接受延时,可以使用弱一致读hint来规避报错;否则,暂时无解。  弱一致读hint详情请参考官方文档 弱一致读(ob_read_consistency) 2. 计划在2.1版本里,支持全局一致性查询,就没有这个问题。 ------------------------- ERROR 4624 (HY000): machine resource is not enough to hold a new unit 报错信息:ERROR 4624 (HY000): machine resource is not enough to hold a new unit OB版本:所有版本 报错原因:     OceanBase从某个角度来说就是将一批机器的资源(CPU/Memory/Disk)聚合在一起形成一个大的“资源池”,然后再从里面分配资源。每个租户都得绑定至少一个Resource Pool。Resource Pool就是从原始的“资源池”里创建出来的。每个Resource Pool由N个相同的Unit组成。每个Unit在某个具体的OBServer内部分配。当创建新的Resource Pool或者调大老的Resource Pool规格时,可能会因为没有OBServer可以分配出对应规格的Unit而报错。 解决办法:     重新计算可用资源,调制分配资源的SQL里的规格。如果可用资源确实不够用,那就先补充机器资源或者释放不用的租户资源,然后再重试。 ------------------------- OceanBase是否开源? 汇总一下有关OceanBase和开源相关的问题的答案。 1. OceanBase 0.4曾经开源,地址为 alibaba/oceanbase 。 喜欢看代码的从中可以学习到一些分布式数据库开发经验。 2. OceanBase从1.0版本不再开源,架构上做了很大的重构,对SQL和存储功能都有加强。不过关于LSM结构、冻结合并的原理没有大变。当前版本进入2.0。将来是否开源目前并无信息。 3. OceanBase 在用户体验上像MySQL,但是绝不是MySQL,也不是基于MySQL版本修改的,不是基于Postgre修改的,不是基于其他任何开源的产品修改的。OceanBase是蚂蚁自主研发的纯粹的分布式数据库,产品开发过程中,特别注意避免侵犯其他公司专利。所以OceanBase是按照一个商业通用数据库去规划设计的。 4. 随时欢迎开发能力很强的同学加入OceanBase内核开发团队。 ------------------------- OceanBase支持分布式事务吗? OceanBase提供多租户能力(租户就是实例)。租户内的分布式事务需求,OceanBase是满足的。原理是两阶段提交协议,强一致。OceanBase对分布式事务两阶段提交过程做了一些优化,性能有提升。如果业务的事务范围超出了租户(实例)的边界,则必须借助第三方分布式事务中间件框架或者应用自己实现分布式事务。蚂蚁SOFA的分布式事务框架DTX支持三种分布式事务方法,即XA、TCC和FMT.其中TCC和FMT都是最终一致。 ------------------------- Q: OceanBase里创建索引是立即生效吗?唯一索引呢?A: 分场景。 如果是在create table里带上了索引(包括唯一索引,也就是唯一性约束),是立即生效的。OB 1.x 版本里在表存在的情况下新建的索引(包括唯一索引),命令立即返回,但是索引不是立即生效。需要等到OB集群发起大合并之后才会生效。其中唯一索引需要等待两次大合并。所以运维建索引后需要安排1-2次大合并操作。OB 2.x 版本里在表存在的情况下新建的索引(包括唯一索引),命令立即返回,索引也不是立即生效,但是索引开始后台异步创建,创建时间取决于数据量。 示例如下: 1. OB 1.x 版本的索引 2. OB 2.x 版本的索引 ------------------------- OceanBase合并触发条件 Q:OceanBase什么时候会触发「合并」? A: OceanBase的数据写之前事务日志redo会及时落盘,但是数据的增量修改会一直在OB的增量内存memtable里,每天会落盘一次,这个就是合并。合并时间可以设定(major_freeze_duty_time)。另外,如果memtable使用率超过阈值(freeze_trigger_percentage),就会触发「冻结」,然后就是minor compaction,以及「转储」操作。转储会释放memtable内存,增量数据被输出到磁盘上,转储有次数限制(最大由参数minor_freeze_times),这个次数用完了就会触发「合并」。合并会比较耗OB的资源,时间长短取决于有多少增量数据要跟基线数据合并。 ## 查看冻结转储参数SHOW parameters WHERE NAME IN ('enable_major_freeze','minor_freeze_times','freeze_trigger_percentage','major_freeze_duty_time') AND svr_ip IN ('11.166.175.6');## 触发冻结合并ALTER system major freeze;SELECT sleep(1);## 查看冻结合并历史SELECT str_to_date(h.gmt_create,'%Y-%m-%d %h:%i:%s') gmt_create, module, EVENT,name1,value1,name2,value2 FROM __all_rootservice_event_history hWHERE h.module IN ('daily_merge','major_freeze', 'root_service')ORDER BY gmt_create DESC LIMIT 50; 示例:

mq4096 2019-12-02 00:39:59 0 浏览量 回答数 0

问题

了解什么是 Redis 的雪崩、穿透和击穿?Redis 崩溃之后会怎么样?【Java问答】37期

剑曼红尘 2020-06-17 13:17:18 31 浏览量 回答数 1

问题

分库分表之后,id 主键如何处理?【Java问答】43期

剑曼红尘 2020-06-23 11:48:33 23 浏览量 回答数 1

回答

1.启停止MongoDB 执行mongod,启MongoDB服务器mongod选项命令执行 mongod --help 主要选项: --dbpath 指定数据目录默认值C:\data\db每mongod进程都需要独立数据目录要3mongod 实例必须3独立数据目录mongod启数据库目录创建mongod.lock文件 文件用于防止其mongod纯净使用该数据目录 --port 指定服务器监听端口号默认端口27017.要运行mongod进程则要给每指定同端口号 --logpath 指定志输路径文件夹读写权限系统文件存创建已文件覆盖掉 清除所原志记录想要保留原志需使用--logappend选项 --config 指定配置文件加载命令行未指定各种选项 2.配置文件启 MongoDB支持文件获取配置信息.需要配置非或者要自化MongoDB启用. 指定配置文件用-f或--config选项. : mongod --config refactorConfig.txt refactorConfig.txt内容: #start MongoDB port = 10000 dbpath = "f:\mongo\db" logpath = "f:\mongo\log\MongoDB.txt" rest = true 配置文件命令行功能 mongod --dbpath "f:\mongo\db" --logpath "f:\mongo\log\MongoDB.txt" --rest --port 10000 配置文件特点: a.#行注释 b.指定选项语种"选项=值"形式.选项区写. c.命令行--rest关选项,值要设true 3.停止MongoDB 使用shutdown命令{"shutdown":1},命令要admin数据库使用.shell提供辅助函数: use admin db.shutdownServer() 4. 监控 使用管理接口,默认情况,启mongod启基本http服务器,该服务默认端口28017.浏览器输入 localhost:28017.些链接需要mongod启,用--rest选项启rest支持 才能进.启rest支持, mongod启使用--nohttpinterface关闭管理接口. 5.serverStatus 要获取运行MongoDB服务器统计信息,基本工具serverStatus命令 db.runCommand({"serverStatus":1}) serverStatus返键解释: "globalLock"值表示全局写入锁占用服务器少间(单位微秒) "mem"包含服务器内存映射少数据,服务器进程虚拟内存驻内存占用情况(单位MB) "indexCounters"表示B树磁盘检索("misses")内存检索("hits")数.比值始升,要考虑加内存. "backgroundFlushing"表示台做少fsync及用少间 "opcounters"文档包含每种主要操作数 "asserts"统计断言数 6.mongostat serverStatus虽强,服务器监控说容易.MongoDB提供mongostat mongostat输些serverStatus提供重要信息,每秒输新行,比前看静态数据实性要. 输列,别 inserts/s commands/s vsize %locked,与serverStatus数据相应. 使用第三插件进行数据库监控. 7.安全认证 认证基础知识 每MongoDB实例数据库都用户,启安全性检查,数据库认证用户才能执行读或写操作. 认证文,MongoDB普通数据作admin数据库处理.admin数据库用户称超级用户(管理员). 认证,管理员读写所数据库,执行特定管理命令,listDatabasesshutdown. 启安全检查前,至少要管理员帐号,shell连接没启安全检查服务器 面添加管理员refactor_root,test数据库添加两普通账号,其读权限.shell创建读用户要 addUser第三参数设true.调用addUser必须响应数据库写权限.所数据库调用addUser, 没启安全检查. 重启数据库,重启加入 --auth 命令行选项,启安全检查 第连接,能test数据库执行任何操作,作读用户认证,能查找,能插入数据.能读写用户认证,能查找插入 数据,能使用show dbs 列举所数据库.超级用户认证,所欲. 8.认证工作原理 数据库用户帐号文档形式存储system.users集合.文档结构 { "_id" : ObjectId("5006a037dff37e149322fd83"), "user" : "refactor_read_write", "readOnly" : false, "pwd" : "5a84584ac51d3f702461fce4c46b0d6b"//根据用户名密码散列 } 知道用户信息何存储及存储位置,进行管理工作. 删除帐户: > db.system.users.remove({"user":"refactor_read"}) > db.auth("refactor_read","refactor") 0 用户认证,服务器认证连接绑定跟踪认证,说驱程序或工具使用连接池或故障切换 另节点,所认证用户必须每新连接重新认证. MongoDB传输协议加密,需加密,用ssh隧道或者类似技术做客户端服务器间加密. 建议MongoDB服务器放防火墙或放应用服务器能访问网络.MongoDB必须能外面访问, 建议使用--bindip选项,指定mongod绑定本ip址.:能本机应用服务器访问,使用 mongod --bindip localhost 默认情况MongoDB启简单http服务器,便于查看运行,锁,复制等面信息,要想公些信息,用 --nohttpinterface关闭管理接口. 用--noscripting完全禁止服务端javascript执行 9.备份修复 MongoDB所数据都存放 数据目录 ,默认目录C:\data\db\.启MongoDB候用--dbpath指定数据目录. 论数据目录哪,都存放着MongoDB所数据.要想备份MongoDB,要简单复制数据目录所文件即. 除非服务器做完整fsync,允许写入,否则运行MongoDB创建数据目录副本并安全,备份能已经 破损,需要修复. 运行MongoDB创建数据目录副本并安全,所先服务器关,再复制数据目录.关闭数据库要停止业务. 10.mongodumpmongorestore mongodump种能运行备份.mongodump运行MongoDB做查询,所查文档写入磁盘. mongodump般客户端,所供运行MongoDB使用,即便处理其请求或执行写入没问题. mongodump使用普通查询机制,所产备份定服务器数据实快照.服务器备份程处理写入,非明显. mongodump备份查询其客户端性能产影响. mongodump --help 获帮助 mongorestore备份恢复数据工具. mongorestore获取mongodump 输结,并备份数据插入运行MongoDB实例. :数据库test备份backup目录 mongodump -d test -o backup 使用mongorestore 恢复testNew 数据库 mongorestore -d testNew --drop backup/test/ -d指定要恢复数据库.--drop指恢复前删除集合(若存),否则数据与现集合数据合并,能覆盖些文档. 使用mongorestore --help获帮助信息 11.fsync锁 虽使用mongodumpmongorestore能停机备份,却失获取实数据视图能力.MongoDBfsync命令 能MongoDB运行复制数据目录损坏数据. fsync命令强制服务器所缓冲区写入磁盘.选择锁住址数据库进步写入,知道释放锁止.写入锁让 fsync备份发挥作用关键. shell,强制执行fsync并获写入锁: db.runCommand({"fsync":1,"lock":1}) ,数据目录数据致,且数据实快照.锁,安全数据目录副本作备份.要数据库运行 快照功能文件系统,比LVM,EBS,用,拍数据库目录快照快. 备份,解锁: db.$cmd.sys.unlock.findOne() db.currentOp() 运行db.currentOp()确保已经解锁(初请求解锁花点间) fsync命令,能非灵备份,用停掉服务器,用牺牲备份实性能.要付代价些写入操作 暂阻塞.唯耽误读写能保证实快照备份式通服务器备份. 12.属备份 虽面备份式灵,都没服务器备份.复制式运行MongoDB,前面提备份技术仅能用 主服务器,用服务器.服务器数据几乎与主服务器同步.太乎属服务器性能或者能能读写, 于能随意选择面3种备份式:关停,转存或恢复工具或fsync命令.服务器备份MongoDB推荐备份式. 13.修复 MongoDB存储式能保证磁盘数据能用,能损毁.MongoDB内置修复功能试着恢复损坏数据文件. 未停止MongoDB应该修复数据库.修复数据库式简单 mongod --repair 启服务器. 修复数据库实际程简单:所文档导马导入,忽略效文档.完,重建索引.数据量,花间, 所数据都要验证,所索引都要重建(MongoDB 1.8 版本引入志系统,使修复间打打缩短). 修复能比修复前少些文档,损坏文档删除. 修复数据库能起压缩数据作用.闲置控件(删除体积较集合,或删除量文档腾空间)修复重新利用. 修复运行服务器数据库,要shell用repairDatabases. use test db.repairDatabase() 答案来源网络,供参考,希望对您有帮助 2.

问问小秘 2019-12-02 03:05:11 0 浏览量 回答数 0

回答

1.启停止MongoDB 执行mongod,启MongoDB服务器mongod选项命令执行 mongod --help 主要选项: --dbpath 指定数据目录默认值C:\data\db每mongod进程都需要独立数据目录要3mongod 实例必须3独立数据目录mongod启数据库目录创建mongod.lock文件 文件用于防止其mongod纯净使用该数据目录 --port 指定服务器监听端口号默认端口27017.要运行mongod进程则要给每指定同端口号 --logpath 指定志输路径文件夹读写权限系统文件存创建已文件覆盖掉 清除所原志记录想要保留原志需使用--logappend选项 --config 指定配置文件加载命令行未指定各种选项 2.配置文件启 MongoDB支持文件获取配置信息.需要配置非或者要自化MongoDB启用. 指定配置文件用-f或--config选项. : mongod --config refactorConfig.txt refactorConfig.txt内容: #start MongoDB port = 10000 dbpath = "f:\mongo\db" logpath = "f:\mongo\log\MongoDB.txt" rest = true 配置文件命令行功能 mongod --dbpath "f:\mongo\db" --logpath "f:\mongo\log\MongoDB.txt" --rest --port 10000 配置文件特点: a.#行注释 b.指定选项语种"选项=值"形式.选项区写. c.命令行--rest关选项,值要设true 3.停止MongoDB 使用shutdown命令{"shutdown":1},命令要admin数据库使用.shell提供辅助函数: use admin db.shutdownServer() 4. 监控 使用管理接口,默认情况,启mongod启基本http服务器,该服务默认端口28017.浏览器输入 localhost:28017.些链接需要mongod启,用--rest选项启rest支持 才能进.启rest支持, mongod启使用--nohttpinterface关闭管理接口. 5.serverStatus 要获取运行MongoDB服务器统计信息,基本工具serverStatus命令 db.runCommand({"serverStatus":1}) serverStatus返键解释: "globalLock"值表示全局写入锁占用服务器少间(单位微秒) "mem"包含服务器内存映射少数据,服务器进程虚拟内存驻内存占用情况(单位MB) "indexCounters"表示B树磁盘检索("misses")内存检索("hits")数.比值始升,要考虑加内存. "backgroundFlushing"表示台做少fsync及用少间 "opcounters"文档包含每种主要操作数 "asserts"统计断言数 6.mongostat serverStatus虽强,服务器监控说容易.MongoDB提供mongostat mongostat输些serverStatus提供重要信息,每秒输新行,比前看静态数据实性要. 输列,别 inserts/s commands/s vsize %locked,与serverStatus数据相应. 使用第三插件进行数据库监控. 7.安全认证 认证基础知识 每MongoDB实例数据库都用户,启安全性检查,数据库认证用户才能执行读或写操作. 认证文,MongoDB普通数据作admin数据库处理.admin数据库用户称超级用户(管理员). 认证,管理员读写所数据库,执行特定管理命令,listDatabasesshutdown. 启安全检查前,至少要管理员帐号,shell连接没启安全检查服务器 面添加管理员refactor_root,test数据库添加两普通账号,其读权限.shell创建读用户要 addUser第三参数设true.调用addUser必须响应数据库写权限.所数据库调用addUser, 没启安全检查. 重启数据库,重启加入 --auth 命令行选项,启安全检查 第连接,能test数据库执行任何操作,作读用户认证,能查找,能插入数据.能读写用户认证,能查找插入 数据,能使用show dbs 列举所数据库.超级用户认证,所欲. 8.认证工作原理 数据库用户帐号文档形式存储system.users集合.文档结构 { "_id" : ObjectId("5006a037dff37e149322fd83"), "user" : "refactor_read_write", "readOnly" : false, "pwd" : "5a84584ac51d3f702461fce4c46b0d6b"//根据用户名密码散列 } 知道用户信息何存储及存储位置,进行管理工作. 删除帐户: > db.system.users.remove({"user":"refactor_read"}) > db.auth("refactor_read","refactor") 0 用户认证,服务器认证连接绑定跟踪认证,说驱程序或工具使用连接池或故障切换 另节点,所认证用户必须每新连接重新认证. MongoDB传输协议加密,需加密,用ssh隧道或者类似技术做客户端服务器间加密. 建议MongoDB服务器放防火墙或放应用服务器能访问网络.MongoDB必须能外面访问, 建议使用--bindip选项,指定mongod绑定本ip址.:能本机应用服务器访问,使用 mongod --bindip localhost 默认情况MongoDB启简单http服务器,便于查看运行,锁,复制等面信息,要想公些信息,用 --nohttpinterface关闭管理接口. 用--noscripting完全禁止服务端javascript执行 9.备份修复 MongoDB所数据都存放 数据目录 ,默认目录C:\data\db\.启MongoDB候用--dbpath指定数据目录. 论数据目录哪,都存放着MongoDB所数据.要想备份MongoDB,要简单复制数据目录所文件即. 除非服务器做完整fsync,允许写入,否则运行MongoDB创建数据目录副本并安全,备份能已经 破损,需要修复. 运行MongoDB创建数据目录副本并安全,所先服务器关,再复制数据目录.关闭数据库要停止业务. 10.mongodumpmongorestore mongodump种能运行备份.mongodump运行MongoDB做查询,所查文档写入磁盘. mongodump般客户端,所供运行MongoDB使用,即便处理其请求或执行写入没问题. mongodump使用普通查询机制,所产备份定服务器数据实快照.服务器备份程处理写入,非明显. mongodump备份查询其客户端性能产影响. mongodump --help 获帮助 mongorestore备份恢复数据工具. mongorestore获取mongodump 输结,并备份数据插入运行MongoDB实例. :数据库test备份backup目录 mongodump -d test -o backup 使用mongorestore 恢复testNew 数据库 mongorestore -d testNew --drop backup/test/ -d指定要恢复数据库.--drop指恢复前删除集合(若存),否则数据与现集合数据合并,能覆盖些文档. 使用mongorestore --help获帮助信息 11.fsync锁 虽使用mongodumpmongorestore能停机备份,却失获取实数据视图能力.MongoDBfsync命令 能MongoDB运行复制数据目录损坏数据. fsync命令强制服务器所缓冲区写入磁盘.选择锁住址数据库进步写入,知道释放锁止.写入锁让 fsync备份发挥作用关键. shell,强制执行fsync并获写入锁: db.runCommand({"fsync":1,"lock":1}) ,数据目录数据致,且数据实快照.锁,安全数据目录副本作备份.要数据库运行 快照功能文件系统,比LVM,EBS,用,拍数据库目录快照快. 备份,解锁: db.$cmd.sys.unlock.findOne() db.currentOp() 运行db.currentOp()确保已经解锁(初请求解锁花点间) fsync命令,能非灵备份,用停掉服务器,用牺牲备份实性能.要付代价些写入操作 暂阻塞.唯耽误读写能保证实快照备份式通服务器备份. 12.属备份 虽面备份式灵,都没服务器备份.复制式运行MongoDB,前面提备份技术仅能用 主服务器,用服务器.服务器数据几乎与主服务器同步.太乎属服务器性能或者能能读写, 于能随意选择面3种备份式:关停,转存或恢复工具或fsync命令.服务器备份MongoDB推荐备份式. 13.修复 MongoDB存储式能保证磁盘数据能用,能损毁.MongoDB内置修复功能试着恢复损坏数据文件. 未停止MongoDB应该修复数据库.修复数据库式简单 mongod --repair 启服务器. 修复数据库实际程简单:所文档导马导入,忽略效文档.完,重建索引.数据量,花间, 所数据都要验证,所索引都要重建(MongoDB 1.8 版本引入志系统,使修复间打打缩短). 修复能比修复前少些文档,损坏文档删除. 修复数据库能起压缩数据作用.闲置控件(删除体积较集合,或删除量文档腾空间)修复重新利用. 修复运行服务器数据库,要shell用repairDatabases. use test db.repairDatabase() “答案来源于网络,供您参考” 希望以上信息可以帮到您! 2.

牧明 2019-12-02 02:17:29 0 浏览量 回答数 0

问题

干货分享:DBA专家门诊一期:索引与sql优化问题汇总

xiaofanqie 2019-12-01 21:24:21 74007 浏览量 回答数 38

回答

你的JDK是错的把,直接用的Eclipse自带的,你换一下试试回复<aclass='referer'target='_blank'>@朋也:Causedby:java.lang.NoSuchMethodError:org.apache.commons.codec.binary.Base64.<init>(I)V这个报错通常是使用的ECLIPSE自带的JDK导致的,应该重新配置成自己的JDK。回复<aclass='referer'target='_blank'>@首席撸出血:配置了的,是jdk1.8,开发工具是idea或者你本地的JDK环境有没有配置缺jar包啊,<spanstyle="color:#444444;font-family:'MicrosoftYaHei',Verdana,sans-serif,宋体;font-size:14px;line-height:normal;background-color:#FFFFFF;">apache.commons.codec这个包估计所使用的jar版本过低了;如果有多个,可删除低版本的试试这个包有的Base64是commons-codec1.0才加入的类,确认下本地的版本是不是不对,另外也确认下是不是存在两个不同版本的jar包冲突<divclass='ref'> 引用来自“逝水fox”的评论Base64是commons-codec1.0才加入的类,确认下本地的版本是不是不对,另外也确认下是不是存在两个不同版本的jar包冲突 基于微博数据检测的Solr实战开发 课程观看地址:<atarget="_blank"rel="nofollow">http://www.xuetuwuyou.com/course/145 课程出自学途无忧网:<atarget="_blank"rel="nofollow">http://www.xuetuwuyou.com solrcloud5.2.1+zookeeper一部精通 课程观看地址:<atarget="_blank"rel="nofollow">http://www.xuetuwuyou.com/course/15 一、课程用到的软件 1.centos6.7 2.apache-tomcat-7.0.47 3.solr-5.5 4.zookeeper3.4.6 5.eclipse-jee-neon-R-win32-x86_64  二、课程目标 在海量数据的情况下,传统的关系型数据库已经力不从心,快速检索已经成为了应用系统所必备的功能之一。本课程从实战角度出发,让学员能从实战中学习到: 1.搜索引擎的原理及架构。  2.掌握在大数据环境下经典检索算法。  3.掌握如何使用solr实现系统快速检索目标。  4.掌握solr在开发中常见的技术大坑与调优技术。 三、适用人群 开发人员、架构师、对分布式搜索引擎有兴趣的朋友。 四、课程内容介绍: 第1课、Solr简介与部署   知识点:Solr基本概念以及应用的介绍、Solr单机版的搭建 第2课、Solr建库实战   知识点:介绍managed-schame和solrConfig两大配置文件,并建立Solr库开始实操 第3课、Solr中文分词器与全量数据导入   知识点:对比中文分词器IK与MMSeg4j的特点、Solr配置MMSeg4j中文分词器、把Mysql中的数据导入到Solr索引库上 第4课、Solr增量数据导入及新管理UI实战   知识点:把Mysql的数据增量导入到Solr索引库上、对Solr5最新的UI进行全面介绍 第5课、Solr数据查询详解   知识点:基于UI管理界面,实战Solrq查询、fq查询以及分页、高亮、Facet等高级特性的使用 第6课、Solrj编程实战之索引增删改   知识点:基于Eclipse开发环境、搭建Solrj工程项目,对Solr的索引库的进行增、删、改的操作 第7课、Solrj编程实战之索引查询与分页   知识点:基于Solrj实现q查询、fq查询以及分页查询的操作 第8课、Solrj编程实战之高亮与Facet   知识点:基于Solrj实现高亮查询、Facet查询的操作 第9课、Solrj编程实战之设计模式   知识点:基于前阶段所写的代码,发现代码中的不足,并使用单例模式、模块方法、回调方法的设计模式进行仿SpringData的开发 第10课、Solr缓存与预热机制剖析   知识点:从算法、应用场景以及实例的多个维度,剖析Solr中的四大缓存,并且站在SolrIndexSearcher的生命周期上解剖预热机制及其注意事项 第11课、Solr高级特性之近实时、实时检索   知识点:从概念、原理以及实例的多个维度,剖析Solr近实时、实时检索 第12课、Solr高级特性之原子更新   知识点:Solr在应用层面上对Lucene进行了封装,在Solr4之后提出了原子更新的新概念,从此在应用层面操作上方便我们进行索引更新 第13课、Solr高级特性之深度分页及性能调优   知识点:Solr4的又一大特性,在面临海量据的情况下,占用更低的资源进行数据检索正是深度分页的一大亮点、后半节结合讲师的实际开发经验,分享Solr性能调优的策略 第14课、SolrCloud部署运维之集群搭建   知识点:基于Centos、zookeeper环境下,搭建SolrCloud系统  第15课、SolrCloud部署运维之库管理   知识点:SolrCloud的运维之道,从UI管理界面以及命令行的两个维度去剖析SolrCloud库的管理,包括库的新增、删除以及动态更新  第16课、SolrCloud部署运维之副本与扩容   知识点:SolrCloud的运维之道,从UI管理界面以及命令行的两个维度去剖析SolrCloud分片的管理,包括分片的备份与库的扩容 第17课、中文分词器配置与使用Solrj操作SolrCloud   知识点:配置中文分词器以及使用Solrj操作SolrCloud来实现增、删、改、查  第18课、项目介绍与环境搭建   知识点:介绍项目的背景以及总体架构、突出Solr在实际项目中的角色。基于Maven搭建开发环境  第19课、框架代码开发之Spring集成Solrj之CRUD(maven版)   知识点:Spring是一个JavaEE企业级框架,它很多主流的主件都进行集成支持。本节学习Spring与Solrj的集成,进行增、删、改、查操作 第20课、框架代码开发之Spring集成Solrj之(maven版)   知识点:Spring是一个JavaEE企业级框架,它对很多主流的组件都进行集成支持。本节学习Spring与Solrj的集成,进行实时检索、高亮、深度分页、Facet查询操作 第21课、基于dom4j的导库组件开发(maven版)   知识点:基于dom4j解析XML文件,并将数据批量高效导入到SolrCloud分布式索引库上进行检索分析 第22课、高级检索组件开发一   知识点:基于SolrCloud实现高级检索,包括多条件查询、高亮、分页操作 第23课、高级检索组件开发二     知识点:基于SolrCloud实现高级检索,包括多条件查询、高亮、分页操作 第24课、相似匹配组件开发一   知识点:基于SolrCloud实现相似性检索操作 第25课、相似匹配组件开发二   知识点:基于SolrCloud实现相似性检索操作 第26课、课程总结与Solr6的展望   知识点:课程大总结,并对最新版的Solr6进行亮点分析以及未来的展望

爱吃鱼的程序员 2020-06-12 15:21:44 0 浏览量 回答数 0

问题

【每日一题】Java知识大测验 | 持续更新

游客ih62co2qqq5ww 2020-03-27 23:52:17 473 浏览量 回答数 1

回答

回2楼啊里新人的帖子 在日常的业务开发中,常见使用到索引的地方大概有两类: 第一类.做业务约束需求,比如需要保证表中每行的单个字段或者某几个组合字段是唯一的,则可以在表中创建唯一索引; 比如:需要保证test表中插入user_id字段的值不能出现重复,则在设计表的时候,就可以在表中user_id字段上创建一个唯一索引: CREATE TABLE `test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`),   UNIQUE KEY `uk_userid` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ; 第二类.提高SQL语句执行速度,可以根据SQL语句的查询条件在表中创建合适的索引,以此来提升SQL语句的执行速度; 此过程好比是去图书找一本书,最慢的方法就是从图书馆的每一层楼每一个书架一本本的找过去;快捷一点的方法就是先通过图书检索来确认这一本书在几楼那个书架上,然后直接去找就可以了;当然创建这个索引也需要有一定的代价,需要存储空间来存放,需要在数据行插入,更新,删除的时候维护索引: 例如: CREATE TABLE `test_record` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `user_id` int(11) NOT NULL,   `gmt_create` datetime DEFAULT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=5635996 DEFAULT CHARSET=utf8 该表有500w的记录,我需要查询20:00后插入的记录有多少条记录: mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (1.31 sec) 可以看到查询耗费了1.31秒返回了1行记录,如果我们在gmt_create字段上添加索引: mysql> alter table test_record add index ind_gmt_create(gmt_create); Query OK, 0 rows affected (21.87 sec) Records: 0  Duplicates: 0  Warnings: 0 mysql> select count(*) from test_record where gmt_create>'2014-12-17 20:00:00'; +----------+ | count(*) | +----------+ |        1 | +----------+ 1 row in set (0.01 sec) 查询只消耗了0.01秒中就返回了记录. 总的来说,为SQL语句(select,update,delete)创建必要的索引是必须的,这样虽然有一定的性能和空间消耗,但是是值得,尤其是在大并发的请求下,大量的数据被扫描造成系统IO和CPU资源消耗完,进而导致整个数据库不可服务. ------------------------- 怎么学好数据库是一个比较大题目,数据库不仅仅是写SQL那么简单,即使知道了SQL怎么写,还需要很清楚的知道这条SQL他大概扫描了多少数据,返回多少数据,是否需要创建索引。至于SQL优化是一个比较专业的技术活,但是可以通过学习是可以掌握的,你可以把一条sql从执行不出来优化到瞬间完成执行,这个过程的成就感是信心满满的。学习的方法可以有以下一些过程:1、自己查资料,包括书本,在线文档,google,别人的总结等等,试图自己解决2、多做实验,证明自己的想法以及判断3、如果实在不行,再去论坛问,或者问朋友4、如果问题解决了,把该问题的整个解决方法记录下来,以备后来的需要5、多关注别人的问题,或许以后自己就遇到了,并总是试图去多帮助别人6、习惯从多个方面去考虑问题,并且养成良好的总结习惯 下面是一些国内顶级数据库专家学习数据库的经验分享给大家: http://www.eygle.com/archives/2005/08/ecinieoracleouo.html 其实学习任何东西都是一样,没有太多的捷径可走,必须打好了坚实的基础,才有可以在进一步学习中得到快速提高。王国维在他的《人间词话》中曾经概括了为学的三种境界,我在这里套用一下: 古今之成大事业、大学问者,罔不经过三种之境界。"昨夜西风凋碧树。独上高楼,望尽天涯路。"此第一境界也。"衣带渐宽终不悔,为伊消得人憔悴。"此第二境界也。"众里寻他千百度,蓦然回首,那人却在灯火阑珊处。"此第三境界也。 学习Oracle,这也是你必须经历的三种境界。 第一层境界是说,学习的路是漫漫的,你必须做好充分的思想准备,如果半途而废还不如不要开始。 这里,注意一个"尽"字,在开始学习的过程中,你必须充分阅读Oracle的基础文档,概念手册、管理手册、备份恢复手册等(这些你都可以在http://tahiti.oracle.com 上找到);OCP认证的教材也值得仔细阅读。打好基础之后你才具备了进一步提升的能力,万丈高楼都是由地而起。 第二层境界是说,尽管经历挫折、打击、灰心、沮丧,也都要坚持不放弃,具备了基础知识之后,你可以对自己感兴趣或者工作中遇到的问题进行深入的思考,由浅入深从来都不是轻而易举的,甚至很多时候你会感到自己停滞不前了,但是不要动摇,学习及理解上的突破也需要时间。 第三次境界是说,经历了那么多努力以后,你会发现,那苦苦思考的问题,那百思不得其解的算法原理,原来答案就在手边,你的思路豁然开朗,宛如拨云见月。这个时候,学习对你来说,不再是个难题,也许是种享受,也许成为艺术。 所以如果你想问我如何速成,那我是没有答案的。 不经一番寒彻骨,哪得梅花扑鼻香。 当然这三种境界在实际中也许是交叉的,在不断的学习中,不断有蓦然回首的收获。 我自己在学习的过程中,经常是采用"由点及面法"。 当遇到一个问题后,一定是深入下去,穷究根本,这样你会发现,一个简单的问题也必定会带起一大片的知识点,如果你能对很多问题进行深入思考和研究,那么在深处,你会发现,这些面逐渐接合,慢慢的延伸到oracle的所有层面,逐渐的你就能融会贯通。这时候,你会主动的去尝试全面学习Oracle,扫除你的知识盲点,学习已经成为一种需要。 由实践触发的学习才最有针对性,才更能让你深入的理解书本上的知识,正所谓:" 纸上得来终觉浅,绝知此事要躬行"。实践的经验于我们是至为宝贵的。 如果说有,那么这,就是我的捷径。 想想自己,经常是"每有所获,便欣然忘食", 兴趣才是我们最好的老师。 Oracle的优化是一门学问,也是一门艺术,理解透彻了,你会知道,优化不过是在各种条件之下做出的均衡与折中。 内存、外存;CPU、IO...对这一切你都需要有充分的认识和相当的了解,管理数据库所需要的知识并不单纯。 作为一个数据库管理人员,你需要做的就是能够根据自己的知识以及经验在各种复杂情况下做出快速正确的判断。当问题出现时,你需要知道使用怎样的手段发现问题的根本;找到问题之后,你需要运用你的知识找到解决问题的方法。 这当然并不容易,举重若轻还是举轻若重,取决于你具备怎样的基础以及经验积累。 在网络上,Howard J. Rogers最近创造了一个新词组:Voodoo Tuning,用以形容那些没有及时更新自己的知识技能的所谓的Oracle技术专家。由于知识的陈旧或者理解的肤浅,他们提供的很多调整建议是错误的、容易使人误解的,甚至是荒诞的。他们提供的某些建议在有些情况下也许是正确的,如果你愿意回到Oracle5版或者6版的年代;但是这些建议在Oracle7.0,8.0 或者 Oracle8i以后往往是完全错误的。 后来基于类似问题触发了互联网内Oracle顶级高手的一系列深入讨论,TOM、Jonathan Lewis、HJR等人都参与其中,在我的网站上(www.eygle.com )上对这些内容及相关链接作了简要介绍,有兴趣的可以参考。 HJR给我们提了很好的一个提示:对你所需要调整的内容,你必须具有充分的认识,否则你做出的判断就有可能是错误的。 这也是我想给自己和大家的一个建议: 学习和研究Oracle,严谨和认真必不可少。 当然 你还需要勤奋,我所熟悉的在Oracle领域有所成就的技术人员,他们共同的特点就是勤奋。 如果你觉得掌握的东西没有别人多,那么也许就是因为,你不如别人勤奋。 要是你觉得这一切过于复杂了,那我还有一句简单的话送给大家: 不积跬步,无以至千里。学习正是在逐渐积累过程中的提高。 现在Itpub给我们提供了很好的交流场所,很多问题都可以在这里找到答案,互相讨论,互相学习。这是我们的幸运,我也因此非常感谢这个网络时代。 参考书籍: 如果是一个新人可以先买一些基本的入门书籍,比如MySQL:《 深入浅出MySQL——数据库开发、优化与管理维护 》,在进阶一点的就是《 高性能MySQL(第3版) 》 oracle的参考书籍: http://www.eygle.com/archives/2006/08/oracle_fundbook_recommand.html 最后建议不要在数据库中使用外键,让应用程序来保证。 ------------------------- Re:回 9楼(千鸟) 的帖子 我有一个问题想问问,现在在做一个与图书有关的项目,其中有一个功能是按图书书名搜索相似图书列表,问题不难,但是想优化一下,有如下问题想请教一下: 1、在图书数据库数据表的书名字段里,按图书书名进行关键字搜索,如何快速搜索相关的图书?   现在由于数据不多,直接用的like模糊查找验证功能而已; 如果数据量不大,是可以在数据库中完成搜索的,可以在搜索字段上创建索引,然后进行搜索查询: CREATE TABLE `book` (   `book_id` int(11) NOT NULL AUTO_INCREMENT,   `book_name` varchar(100) NOT NULL,   .............................   PRIMARY KEY (`book_id`),   KEY `ind_name` (`book_name`) ) ENGINE=InnoDB select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id  where book.book_id=book_search_id.book_id; 但是当数据量变得很大后,就不在适合了,可以采用一些其他的第三方搜索技术比如sphinx; 2、如何按匹配的关键度进行快速排序?比如搜索“算法”,有一本书是《算法》,另一本书是《算法设计》,要求前者排在更前面。 现在的排序是根据数据表中的主键序号id进行的排序,没有达到想要的效果。 root@127.0.0.1 : test 15:57:12> select book_id,book_name from book_search where book_name like '%算%' order by book_name; +---------+--------------+ | book_id | book_name    | +---------+--------------+ |       2 | 算法       | |       1 | 算法设计 | ------------------------- 回 10楼(大黑豆) 的帖子 模糊查询分为半模糊和全模糊,也就是: select * from book where name like 'xxx%';(半模糊) select * from book where name like '%xxx%';(全模糊) 半模糊可以可以使用到索引,全模糊在上面场景是不能使用到索引的,但可以进行一些改进,比如: select book.*  from book , (select book_id from book where book_name like '%算法%')  book_search_id   where book.book_id=book_search_id.book_id; 注意这里book_id是主键,同时在book_name上创建了索引 上面的sql语句可以利用全索引扫描来完成优化,但是性能不会太好;特别在数据量大,请求频繁的业务场景下不要在数据库进行模糊查询; 非得使用数据库的话 ,建议不要在生产库进行查询,可以在只读节点进行查询,避免查询造成主业务数据库的资源消耗完,导致故障. 可以使用一些开源的搜索引擎技术,比如sphinx. ------------------------- 回 11楼(蓝色之鹰) 的帖子 我想问下,sql优化一般从那几个方面入手?多表之间的连接方式:Nested Loops,Hash Join 和 Sort Merge Join,是不是Hash Join最优连接? SQL优化需要了解优化器原理,索引的原理,表的存储结构,执行计划等,可以买一本书来系统的进行学习,多多实验; 不同的数据库优化器的模型不一样,比如oracle支持NL,HJ,SMJ,但是mysql只支持NL,不通的连接方式适用于不同的应用场景; NL:对于被连接的数据子集较小的情况,嵌套循环连接是个较好的选择 HJ:对于列连接是做大数据集连接时的常用方式 SMJ:通常情况下散列连接的效果都比排序合并连接要好,然而如果行源已经被排过序,在执行排序合并连接时不需要再排序了,这时排序合并连接的性能会优于散列连接 ------------------------- Re:回 19楼(原远) 的帖子 有个问题:分类表TQueCategory,问题表TQuestion(T-SQL) CREATE TABLE TQueCategory ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题分类ID NAME VARCHAR(20)        --问题分类名称 ) CREATE TABLE TQuestion ( ID INT IDENTITY(1,1) PRIMARY KEY,        --问题ID CateID INT NOT NULL,        --问题分类ID TITLE VARCHAR(50),        --问题标题 CONTENT VARCHAR(500)        --问题内容 ) 当前要统计某个分类下的问题数,有两种方式: 1.每次统计,在TQuestion通过CateID进行分组统计 SELECT CateID,COUNT(1) AS QueNum FROM TQuestion GROUP BY CateID WHERE 1=1 2.在TQueCategory表增加字段QueNum,用于标识该分类下的问题数量 ALTER TABLE TQueCategory ADD QueNum INT SELECT CateID,QueNum FROM TQueCategory 问:在哪种业务应用场景下采用上面哪种方式性能比较好,为什么? ############################################################################################### 方案 一 需要对 TQuestion 的 CateID字段 进行分组 ,可以在 CateID上创建一个索引,这样就可以索引扫描来完成查询; 方案 二 需要对 TQueCategory 进行扫描就可以得出结果,但是必须在问题表有插入,删除的时候维护quenum数量; 单单从SQL的性能来看, 分类表的数量应该是远远小于问题表的数量的,所以方案二的性能会比较好; 但是如果 TQuestion 的插入非常频繁的话,会带来对 TQueCategory的频繁更新,一次 TQuestion 的 insert或deleted就会带来一次 TQueCategory 的update,这个代价其实是蛮高的; 如果这个分类统计的查询不是非常频繁的话,建议还是使用方案一; 同时还可能还会其他的业务逻辑统计需求(例如: CateID +时间),这个时候在把逻辑放到 TQueCategory就不合适了。 ------------------------- 回 20楼(原远) 的帖子 经验之谈,仅供参考 使用外键在开发上确实省去了很多功夫,但是把业务逻辑交由数据库来完成,对后期的维护来说是很麻烦的事情,不利于维护. ------------------------- 回 21楼(玩站网) 的帖子 无关技术方面: 咨询一下,现在mysql新的版本,5.5.45后貌似修改了开源协议。 是否意味着今后我们商业化使用mysql将受到限制? 如果甲骨文真周到那一步,rds是否会受到影响? 一个疑惑: 为什么很少见到有人用mysql正则匹配?性能不好还是什么原因? ######################################## MySQL有商业版 和 社区版,RDS的MySQL采用开源的社区版进行改进,由专门的RDS MySQL源码团队来维护,国内TOP 10的mysql源码贡献者大部分都在RDS,包括了@丁奇 ,@彭立勋 ,@印风 等; 不在数据库中做业务计算,是保证数据库运行稳定的一个好的设计经验; 是否影响性能与你的sql的执行频率,需要参与的计算数据量相关,当然了还包括数据库所在主机的IO,cpu,内存等资源,离开了这些谈性能是没有多大意义的; ------------------------- 回 22楼(比哥) 的帖子 分页该怎么优化才行??? ######################### 可以参考这个链接,里面有很多的最佳实践,其中就包括了分页语句的优化: http://bbs.aliyun.com/read/168647.html?spm=5176.7114037.1996646101.1.celwA1&pos=1 普通写法: select  *  from t where sellerid=100 limit 100000,20 普通limit M,N的翻页写法,往往在越往后翻页的过程中速度越慢,原因 mysql会读取表中的前M+N条数据,M越大,性能就越差: 优化写法: select t1.* from  t t1,             (select id from t  sellerid=100 limit 100000,20) t2 where t1.id=t2.id; 优化后的翻页写法,先查询翻页中需要的N条数据的主键id,在根据主键id 回表查询所需要的N条数据,此过程中查询N条数据的主键ID在索引中完成 注意:需要在t表的sellerid字段上创建索引 create index ind_sellerid on t(sellerid); 案例: user_A (21:42:31): 这个sql该怎么优化,执行非常的慢: | Query   |   51 | Sending data | select id, ... from t_buyer where sellerId = 765922982 and gmt_modified >= '1970-01-01 08:00:00' and gmt_modified <= '2013-06-05 17:11:31' limit 255000, 5000 SQL改写:selectt2.* from (selectid from t_buyer where sellerId = 765922982   andgmt_modified >= '1970-01-01 08:00:00'   andgmt_modified <= '2013-06-05 17:11:31' limit255000, 5000)t1,t_buyer t2 where t1.id=t2.id index:seller_id,gmt_modified user_A(21:58:43): 好像很快啊。神奇,这个原理是啥啊。牛!!! user_A(21:59:55): 5000 rows in set (4.25 sec), 前面要90秒。 ------------------------- 回 27楼(板砖大叔) 的帖子 这里所说的索引都是普通的b-tree索引,mysql,sqlserver,oracle 的关系数据库都是默认支持的; ------------------------- 回 32楼(veeeye) 的帖子 可以详细说明一下“最后建议不要在数据库中使用外键,让应用程序来保证。 ”的原因吗?我们公司在项目中经常使用外键,用程序来保证不是相对而言更加复杂了吗? 这里的不建议使用外键,主要考虑到 : 第一.维护成本上,把一些业务逻辑交由数据库来保证,当业务需求发生改动的时候,需要同时考虑应用程序和数据库,有时候一些数据库变更或者bug,可能会导致外键的失效;同时也给数据库的管理人员带来维护的麻烦,不便于管理。 第二.性能上考虑,当大量数据写入的时候,外键肯定会带来一定的性能损耗,当出现这样的问题时候,再来改造去除外键,真的就不值得了; 最后,不在数据库中参与业务的计算(存储过程,函数,触发器,外键),是保证数据库运行稳定的一个好的最佳实践。 ------------------------- 回 33楼(优雅的固执) 的帖子 ReDBA专家门诊一期:索引与sql优化 十分想请大师分享下建立索引的经验 我平时简历索引是这样的 比如订单信息的话 建立 订单号  唯一聚集索引 其他的比如   客户编号 供应商编号 商品编号 这些建立非聚集不唯一索引   ################################################## 建立索引,需要根据你的SQL语句来进行创建,不是每一个字段都需要进行创建,也不是一个索引都不创建,,可以把你的SQL语句,应用场景发出来看看。 索引的创建确实是一个非常专业的技术活,需要掌握:表的存储方式,索引的原理,数据库的优化器,统计信息,最后还需要能够读懂数据库的执行计划,以此来判断索引是否创建正确; 所以需要进行系统的学习才能掌握,附件是我在2011年的时候的一次公开课的ppt,希望对你有帮助,同时可以把你平时遇到的索引创建的疑惑发到论坛上来,大家可以一起交流。 ------------------------- 回 30楼(几几届) 的帖子 我也是这样,简单的会,仔细写也会写出来,但是就是不知道有没有更快或者更好的 #################################################### 多写写SQL,掌握SQL优化的方法,自然这些问题不在话下了。 ------------------------- 回 40楼(小林阿小林) 的帖子 mysql如何查询需要优化的语句,比如慢查询的步奏,如何找出需要通知程序员修改或者优化的sql语句 ############################################################ 可以将mysql的慢日志打开,就可以记录执行时间超过指定阀值的慢SQL到本地文件或者数据库的slow_log表中; 在RDS中默认是打开了慢日志功能的:long_query_time=1,表示会记录执行时间>=1秒的慢sql; 如何快速找到mysql瓶颈: 简单一点的方法,可以通过监控mysql所在主机的性能(CPU,IO,load等)以及mysql本身的一些状态值(connections,thread running,qps,命中率等); RDS提供了完善的数据库监控体系,包括了CPU,IOPS,Disk,Connections,QPS,可以重点关注cpu,IO,connections,disk 4个 指标; cpu,io,connections主要体现在了性能瓶颈,disk主要体现了空间瓶颈; 有时候一条慢sql语句的频繁调用,也可能导致整个实例的cpu,io,connections达到100%;也有可能一条排序的sql语句,消耗大量的临时空间,导致实例的空间消耗完。 ------------------------- 下面是分析一个cpu 100%的案例分析:该实例的cpu已经到达100% 查看当前数据库的活动会话信息:当前数据库有较多的活跃线程在数据库中执行查看当前数据库正在执行的sql: 可以看到这条sql执行的非常缓慢:[tr=rgb(100, 204, 255)]delete from task_process where task_id='1801099' 查看这个表的索引: CREATE TABLE `task_process` (  `id` int(11) NOT NULL AUTO_INCREMENT,    ................  `task_id` int(11) NOT NULL DEFAULT '0' COMMENT '??????id',   ................  PRIMARY KEY (`id`),  KEY `index_over_task` (`is_over`,`task_id`),  KEY `index_over` (`is_over`,`is_auto`) USING BTREE,  KEY `index_process_sn` (`process_sn`,`is_over`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=32129710; 可以看到这个表有3KW的数据,但是没有task_id字段开头的索引,导致该sql语句删除需要进行全表扫描: 在我们的诊断报告中已经将该sql语句捕获到,同时给你提出该怎样进行索引的添加。 广告:诊断报告将会在1月底发布到控制台,到时候用户可以直接查看诊断建议,来完成你的数据库优化。 ------------------------- 回 45楼(dentrite) 的帖子 datetime和int都是占用数据库4个字节,所以在空间上没有什么差别;但是为了可读性,建议还是使用datetime数据类型。 ------------------------- 回 48楼(yuantel) 的帖子 麻烦把ecs_brand和ecs_goods的表结构发出来一下看看 。 ------------------------- 回 51楼(小林阿小林) 的帖子 普通的 ECS服务器上目前还没有这样的慢SQL索引建议的工具。 不过后续有IDBCloud将会集成这样的sql诊断功能,使用他来管理ECS上的数据库就可以使用这样的功能了 。

玄惭 2019-12-02 01:16:11 0 浏览量 回答数 0

回答

楼主知道逻辑地址、物理地址、线性地址的差异吗?如果不知道,可以GOOGLE一下。然后列在OSC上。或许你列完,你就知道你困惑的地方应该用什么方案了。。 ###### 刚了解了一下SQLite的文件结构,发现是b-tree和b+tree。 难道btree真的是最适合数据文件结构的吗###### 引用来自“clonne”的答案 刚了解了一下SQLite的文件结构,发现是b-tree和b+tree。 难道btree真的是最适合数据文件结构的吗 别总认为别人的方案就是唯一方案。你先把原理搞清楚,然后充分描述自己的问题,之后得到的方案就是最好的。其他方案都SB,无论是哪个牛人写的,因为他们不是为你的问题写的。 ###### 楼主知识面还不够宽。 对文件操作只知道那几个还是不够的。 列举的操作是操作系统对上层应用提供的接口。 具体到存储部分,操作系统还提供了其他操作方式。 至于数据库组织方式。 并非只有一种。 Btree 和 这种数据组织方式多用在索引上。###### 少年,大学时操作系统和数据库没好好听吧。 Key-Value模型目前最好的就是B+树吧。 不规则模型参考Linux的文件系统。

kun坤 2020-06-06 16:50:32 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播