• 关于

    索引存储怎么用

    的搜索结果

回答

1.适当调整mysql一些参数 2.若此表不需要事务,可以把此表存储引擎设置为myisam 3.建立合适索引(索引优化可以去百度),索引设置之后怎么应用与查询sql 4.用explain[show] sql 查询一下sql利用索引情况,已经查询记录情况(详细可以百度) 5.根据表结构情况,进行适当拆分。 6.存储(能优化的话,尽量别用) 基本我这边一张表一秒数据大概是2000条入库、表实时查询,先数据库 已经有了3000W,但是查询速度很快。(后期会根据情况拆分,会更加优化)

落地花开啦 2019-12-02 01:50:02 0 浏览量 回答数 0

问题

Mysql时间字段格式如何选择,TIMESTAMP,DATETIME,INT?

西秦说云 2019-12-01 19:39:57 1512 浏览量 回答数 1

问题

设置了版本号之后,多元索引就没法用了,这个场景,我应该怎么处理呢?

初商 2019-12-01 19:48:01 2 浏览量 回答数 0

阿里云爆款特惠专场,精选爆款产品低至0.95折!

爆款ECS云服务器8.1元/月起,云数据库低至1.5折,限时抢购!

问题

理解MySQL——索引与优化

老毛哈哈 2019-12-01 21:05:12 9617 浏览量 回答数 1

问题

什么是B+树 6月1日【今日算法】

游客ih62co2qqq5ww 2020-06-01 14:50:52 1 浏览量 回答数 1

回答

简介 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

回答

如大家所知道的,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

回答

回 2楼(zc_0101) 的帖子 您好,       您的问题非常好,SQL SERVER提供了很多关于I/O压力的性能计数器,请选择性能计算器PhysicalDisk(LogicalDisk),根据我们的经验,如下指标的阈值可以帮助你判断IO是否存在压力: 1.  % Disk Time :这个是磁盘时间百分比,这个平均值应该在85%以下 2.  Current Disk Queue Length:未完成磁盘请求数量,这个每个磁盘平均值应该小于2. 3.  Avg. Disk Queue Length:磁盘请求队列的平均长度,这个每个磁盘平均值也应该小于2 4.  Disk Transfers/sec:每次磁盘传输数量,这个每个磁盘的最大值应该小于100 5.  Disk Bytes/sec:每次磁盘传入字节数,这个在普通的磁盘上应该在10M左右 6.  Avg. Disk Sec/Read:从磁盘读取的平均时间,这个平均值应该小于10ms(毫秒) 7.  Avg. Disk Sec/Write:磁盘写入的平均时间,这个平均值也应该小于10ms(毫秒) 以上,请根据自己的磁盘系统判断,比如传统的机械臂磁盘和SSD有所不同。 一般磁盘的优化方向是: 1. 硬件优化:比如使用更合理的RAID阵列,使用更快的磁盘驱动器,添加更多的内存 2. 数据库设置优化:比如创建多个文件和文件组,表的INDEX和数据放到不同的DISK上,将数据库的日志放到单独的物理驱动器,使用分区表 3. 数据库应用优化:包括应用程序的设计,SQL语句的调整,表的设计的合理性,INDEX创建的合理性,涉及的范围很广 希望对您有所帮助,谢谢! ------------------------- 回 3楼(鹰舞) 的帖子 您好,      根据您的描述,由于查询产生了副本REDO LOG延迟,出现了架构锁。我们知道SQL SERVER 2012 AlwaysOn在某些数据库行为上有较多变化。我们先看看架构锁: 架构锁分成两类: 1. SCH-M:架构更改锁,主要发生在数据库SCHEMA的修改上,从你的描述看,没有更改SCHEMA,那么可以排除这个因素 2. SCH-S:架构稳定锁,主要发生在数据库的查询编译等活动 根据你的情况,应该属于SCH-S导致的。查询编译活动主要发生有新增加了INDEX, 更新了统计信息,未参数化的SQL语句等等 对于INDEX和SQL语句方面应,我想应该不会有太多问题。 我们重点关注一下统计信息:SQL SERVER 2012 AG副本的统计信息维护有两种: 1. 主体下发到副本 2. 临时统计信息存储在TEMPDB 对于主体下发的,我们可以设置统计信息的更新行为,自动更新时,可以设置为异步的(自动更新统计信息必须首先打开): USE [master] GO ALTER DATABASE [Test_01]     SET AUTO_UPDATE_STATISTICS_ASYNC ON WITH NO_WAIT GO 这样的话查询优化器不等待统计信息更新完成即编译查询。可以优化一下你的BLOCK。 对于临时统计信息存储在TEMPDB里面也是很重要的,再加上ALWAYSON的副本数据库默认是快照隔离,优化TEMPDB也是必要的,关于优化TEPDB这个我想大部分都知道,这里只是提醒一下。 除了从统计信息本身来解决,在查询过程中,可以降低查询的时间,以尽量减少LOCK的时间和范围,这需要优化你的SQL语句或者应用程序。 以上,希望对您有所帮助。谢谢! ------------------------- 回 4楼(leamonjxl) 的帖子 这是一个关于死锁的问题,为了能够提供帮助一些。请根据下列建议进行: 1.    跟踪死锁 2.    分析死锁链和原因 3.    一些解决办法 关于跟踪死锁,我们首先需要打开1222标记,例如DBCC TRACEON(1222,-1), 他将收集的信息写入到死锁事件发生的服务器上的日志文件中。同时建议打开Profiler的跟踪信息: 如果发生了死锁,需要分析死锁发生的根源在哪里?我们不是很清楚你的具体发生死锁的形态是怎么样的。 关于死锁的实例也多,这里不再举例。 这里只是提出一些可以解决的思路: 1.    减少锁的争用 2.    减少资源的访问数 3.    按照相同的时间顺序访问资源 减少锁的争用,可以从几个方面入手 1.    使用锁提示,比如为查询语句添加WITH (NOLOCK), 但这还取决于你的应用是否允许,大部分分布式的系统都是可以加WITH (NOLOCK), 金融行业可能需要慎重。 2.    调整隔离级别,使用MVCC,我们的数据库默认级别是READ COMMITED. 建议修改为读提交快照隔离级别,这样的话可以尽量读写不阻塞,只不过MVCC的ROW VERSION保存到TEMPDB下面,需要维护好TEMPDB。当然如果你的整个数据库隔离级别可以设置为READUNCOMMINTED,这些就不必了。 减少资源的访问数,可以从如下几个方面入手: 1.    使用聚集索引,非聚集INDEX的叶子页面与堆或者聚集INDEX的数据页面分离。因此,如果对非聚集INDEX 操作的话,会产生两个锁,一个是基本表,一个是非聚集INDEX。而聚集INDEX就不一样,聚集INDEX的叶子页面和表的数据页面相同,他只需要一个LOCK。 2.    查询语句尽量使用覆盖INDEX, 使用全覆盖INDEX,就不需要访问基本表。如果没有全覆盖,还会通过RID或者CLUSTER INDEX访问基本表,这样产生的LOCK可能会与其他SESSION争用。 按照相同的时间顺序访问资源: 确保每个事务按照相同的物理顺序访问资源。两个事务按照相同的物理顺序访问,第一个事务会获得资源上的锁而不会被第二个事务阻塞。第二个事务想获得第一个事务上的LOCK,但被第一个事务阻塞。这样的话就不会导致循环阻塞的情况。 ------------------------- 回 4楼(leamonjxl) 的帖子 两种方式看你的业务怎么应用。这里不仅是分表的问题,还可能存在分库,分服务器的问题。取决与你的架构方案。 物理分表+视图,这是一种典型的冷热数据分离的方案,大致的做法如下: 1.    保留最近3个月的数据为当前表,也即就是我们说的热数据 2.    将其他数据按照某种规则分表,比如按照年或者季度或者月,这部分是相对冷的数据 分表后,涉及到几个问题: 第一问题是,转移数据的过程,一般是晚上业务比较闲来转移,转移按照一定的规则来做,始终保持3个月,这个定时任务本身也很消耗时间 再者,关于查询部分,我想你们的数据库服务器应该通过REPLICATION做了读写分离的吧,主库我觉得压力不会太大,主要是插入或者更新,只读需要做视图来包含全部的数据,但通过UNION ALL所有分表的数据,最后可能还是非常大,在某些情况下,性能不一定好。这个是不是业务上可以解决。比如,对于1年前的历史数据,放在单独的只读上,相对热的数据放在一起,这样压力也会减少。 分区表的话,因为涉及到10亿数据,要有好的分区方案,相对比较简单一点。但对于10亿的大表,始终是个棘手的问题,无论分多少个分区,单个服务器的资源也是有限的。可扩展性方面也存在问题,比如在只读上你没有办法做服务器级别的拆分了。这可能也会造成瓶颈。 现在很多企业都在做分库分表,这些的要解决一些高并发,数据量大的问题。不知是否考虑过类似于中间件的方案,比如阿里巴巴的TDDL类似的方案,如果你有兴趣,可以查询相关资料。 ------------------------- 回 9楼(jiangnii) 的帖子 阿里云数据库不仅提供一个数据库,还提供数据库一种服务。阿里云数据库不仅简化了基础架构的部署,还提供了数据库高可用性架构,备份服务,性能诊断服务,监控服务,专家服务等等,保证用户放心、方便、省心地使用数据库,就像水电一样。以前的运维繁琐的事,全部由阿里云接管,用户只需要关注数据库的使用和具体的业务就好。 关于优化和在云数据库上处理大数据量或复杂的数据操作方面,在云数据库上是一样的,没有什么特别的地方,不过我们的云数据库是使用SSD磁盘,这个比普通的磁盘要快很多,IO上有很大的优势。目前单个实例支持1T的数据量大小。陆续我们会推出更多的服务,比如索引诊断,连接诊断,容量分析,空间诊断等等,这些工作可能是专业的DBA才能完成的,以后我们会提供自动化的服务来为客户创造价值,希望能帮助到客户。 谢谢! ------------------------- 回 12楼(daniellin17) 的帖子 这个问题我不知道是否是两个问题,一个是并行度,另一个是并发,我更多理解是吞吐量,单就并行度而言。 提高并行度需要考虑的因素有: 1.    可用于SQL SERVER的CPU数量 2.    SQL SERVER的版本(32位/64位) 3.    可用内存 4.    执行的查询类型 5.    给定的流中处理的行数 6.    活动的并发连接数量 7.    sys.configurations参数:affinity mask/max server memory (MB)/ max degree of parallelism/ cost threshold for parallelism 以DOP的参数控制并行度为例,设置如下: SELECT * FROM sys.configurations WITH (NOLOCK) WHERE name = 'max degree of parallelism' EXEC sp_configure 'max degree of parallelism',2 RECONFIGURE WITH OVERRIDE 经过测试,DOP设置为2是一个比较适中的状态,特别是OLTP应用。如果设置高了,会产生较多的SUSPEND进程。我们可以观察到资源等待资源类型是:CXPACKET 你可以用下列语句去测试: DBCC SQLPERF('sys.dm_os_wait_stats',CLEAR) SELECT * FROM sys.dm_os_wait_stats WITH (NOLOCK) ORDER BY 2 DESC ,3 DESC 如果是吞吐量的话。优化的范围就很广了。优化是系统性的。硬件配置我们选择的话,大多根据业务量来预估,然后考虑以下: 1.    RAID的划分,RAID1适合存放事务日志文件(顺序写),RAID10/RAID5适合做数据盘,RAID10是条带化并镜像,RAID5条带化并奇偶校验 2.    数据库设置,比如并行度,连接数,BUFFER POOL 3.    数据库文件和日志文件的存放规则,数据库文件的多文件设置规则 4.    TEMPDB的优化原则,这个很重要的 5.    表的设计方面根据业务类型而定 6.    CLUSTERED INDEX和NONCLUSTERED INDEX的设计 7.    阻塞分析 8.    锁和死锁分析 9.    执行计划缓冲分析 10.    存储过程重编译 11.    碎片分析 12.    查询性能分析,这个有很多可以优化的方式,比如OR/UNION/类型转换/列上使用函数等等 我这里列举一个高并发的场景: 比如,我们的订单,比如搞活动的时候,订单刷刷刷地增长,单个实例可能每秒达到很高很高,我们分析到最后最常见的问题是HOT PAGE问题,其等待类型是PAGE LATCH竞争。这个过程可以这么来处理,简单列几点,可以参考很多涉及高并发的案例: 1.    数据库文件和日志文件分开,存放在不同的物理驱动器磁盘上 2.    数据库文件需要与CPU个数形成一定的比例 3.    表设计可以使用HASH来作为表分区 4.    表可以设置无序的KEY/INDEX,比如使用GUID/HASH VALUE来定义PRIMARY KEY CLUSTER INDEX 5.    我们不能将自增列设计为聚集INDEX 这个场景只是针对高并发的插入。对于查询而言,是不适合的。但这些也可能导致大量的页拆分。只是在不同的场景有不同的设计思路。这里抛砖引玉。 ------------------------- 回 13楼(zuijh) 的帖子 ECS上现在有两种磁盘,一种是传统的机械臂磁盘,另一种是SSD,请先诊断你的IO是否出现了问题,本帖中有提到如何判断磁盘出现问题的相关话题,请参考。如果确定IO出现问题,可以尝试使用ECS LOCAL SSD。当然,我们欢迎你使用云数据库的产品,云数据库提供了很多有用的功能,比如高可用性,灵活的备份方案,灵活的弹性方案,实用的监控报警等等。 ------------------------- 回 17楼(豪杰本疯子) 的帖子 我们单个主机或者单个实例的资源总是有限的,因为涉及到很大的数据量,对于存储而言是个瓶颈,我曾使用过SAN和SAS存储,SAN存储的优势确实可以解决数据的灵活扩展,但是SAN也分IPSAN和FIBER SAN,如果IPSAN的话,性能会差一些。即使是FIBER SAN,也不是很好解决性能问题,这不是它的优势,同时,我们所有DB SERVER都连接到SAN上,如果SAN有问题,问题涉及的面就很广。但是SAS毕竟空间也是有限的。最终也会到瓶颈。数据量大,是造成性能问题的直接原因,因为我们不管怎么优化,一旦数据量太大,优化的能力总是有限的,所以这个时候更多从架构上考虑。单个主机单个实例肯定是抗不过来的。 所以现在很多企业在向分布式系统发展,对于数据库而言,其实有很多形式。我们最常见的是读写分离,比如SQL SERVER而言,我们可以通过复制来完成读写分离,SQL SERVER 2012及以后的版本,我们可以使用ALWAYSON来实现读写分离,但这只能解决性能问题,那空间问题怎么解决。我们就涉及到分库分表,这个分库分表跟应用结合得紧密,现在很多公司通过中间件来实现,比如TDDL。但是中间件不是每个公司都可以玩得转的。因此可以将业务垂直拆分,那么DB也可以由此拆分开来。举个简单例子,我们一个典型的电子商务系统,有订单,有促销,有仓库,有配送,有财务,有秒杀,有商品等等,很多公司在初期,都是将这些放在一个主机一个实例上。但是这些到了一定规模或者一定数据量后,就会出现性能和硬件资源问题,这时我们可以将它们独立一部分获完全独立出来。这些都是一些好的方向。希望对你有所帮助。 ------------------------- 回 21楼(dt) 的帖子 问: 求大数据量下mysql存储,优化方案 分区好还是分表好,分的过程中需要考虑事项 mysql高并发读写的一些解决办法 答: 分区:对于应用来说比较简单,改造较少 分表: 应用需较多改造,优点是数据量太大的情况下,分表可以拆分到多个实例上,而分区不可以。 高并发优化,有两个建议: 1.    优化事务逻辑 2.    解决mysql高并发热点,这个可以看看阿里的一个热点补丁: http://www.open-open.com/doc/view/d58cadb4fb68429587634a77f93aa13f ------------------------- 回 23楼(aelven) 的帖子 对于第一个问题.需要看看你的数据库架构是什么样的?比如你的架构具有高可用行?具有读写分离的架构?具有群集的架构.数据库应用是否有较冷门的功能。高并发应该不是什么问题。可扩展性方面需要考虑。阿里云数据库提供了很多优势,比如磁盘是性能超好的SSD,自动转移的高可用性,没有任何单点,自动灵活的备份方案,实用的监控报警,性能监控服务等等,省去DBA很多基础性工作。 你第二个问题,看起来是一个高并发的场景,这种高并发的场景容易出现大量的LOCK甚至死锁,我不是很清楚你的业务,但可以建议一下,首先可以考虑快照隔离级别,实现行多版本控制,让读写不要阻塞。至于写写过程,需要加锁的粒度降低最低,同时这种高并发也容易出现死锁,关于死锁的分析,本帖有提到,请关注。 第三个问题,你用ECS搭建自己的应用也是可以的,RDS数据库提供了很多功能,上面已经讲到了。安全问题一直是我们最看重的问题,肯定有超好的防护的。 ------------------------- 回 26楼(板砖大叔) 的帖子 我曾经整理的关于索引的设计与规范,可以供你参考: ----------------------------------------------------------------------- 索引设计与规范 1.1    使用索引 SQL SERVER没有索引也可以检索数据,只不过检索数据时扫描这个表而异。存储数据的目的,绝大多数都是为了再次使用,而一般数据检索都是带条件的检索,数据查询在数据库操作中会占用较大的比例,提高查询的效率往往意味着整个数据库性能的提升。索引是特定列的有序集合。索引使用B-树结构,最小优化了定位所需要的键值的访问页面量,包含聚集索引和非聚集索引两大类。聚集索引与数据存放在一起,它决定表中数据存储的物理顺序,其叶子节点为数据行。 1.2    聚集索引 1.2.1    关于聚集索引 没聚集索引的表叫堆。堆是一种没有加工的数据,以行标示符作为指向数据存储位置的指针,数据没有顺序。聚集索引的叶子页面和表的数据页面相同,因此表行物理上按照聚集索引列排序,表数据的物理顺序只有一种,所以一个表只有一个聚集索引。 1.2.2    与非聚集索引关系 非聚集索引的一个索引行包含指向表对应行的指针,这个指针称为行定位器,行定位器的值取决于数据页保存为堆还是被聚集。若是堆,行定位器指向的堆中数据行的行号指针,若是聚集索引表,行定位器是聚集索引键值。 1.2.3    设计聚集索引注意事项     首先创建聚集索引     聚集索引上的列需要足够短     一步重建索引,不要使用先DROP再CREATE,可使用DROP_EXISTING     检索一定范围和预先排序数据时使用,因为聚集索引的叶子与数据页面相同,索引顺序也是数据物理顺序,读取数据时,磁头是按照顺序读取,而不是随机定位读取数据。     在频繁更新的列上不要设计聚集索引,他将导致所有的非聚集所有的更新,阻塞非聚集索引的查询     不要使用太长的关键字,因为非聚集索引实际包含了聚集索引值     不要在太多并发度高的顺序插入,这将导致页面分割,设置合理的填充因子是个不错的选择 1.3    非聚集索引 1.3.1    关于非聚集索引 非聚集索引不影响表页面中数据的顺序,其叶子页面和表的数据页面时分离的,需要一个行定位器来导航数据,在将聚集索引时已经有说明,非聚集索引在读取少量数据行时特别有效。非聚集索引所有可以有多个。同时非聚集有很多其他衍生出来的索引类型,比如覆盖索引,过滤索引等。 1.3.2    设计非聚集索引     频繁更新的列,不适合做聚集索引,但可以做非聚集索引     宽关键字,例如很宽的一列或者一组列,不适合做聚集索引的列可作非聚集索引列     检索大量的行不宜做非聚集索引,但是可以使用覆盖索引来消除这种影响 1.3.3    优化书签查找 书签会访问索引之外的数据,在堆表,书签查找会根据RID号去访问数据,若是聚集索引表,一般根据聚集索引去查找。在查询数据时,要分两个部分来完成,增加了读取数据的开销,增加了CPU的压力。在大表中,索引页面和数据页面一般不会临近,若数据只存在磁盘,产生直接随机从磁盘读取,这导致更多的消耗。因此,根据实际需要优化书签查找。解决书签查找有如下方法:     使用聚集索引避免书签查找     使用覆盖索引避免书签查找     使用索引连接避免数据查找 1.4    聚集与非聚集之比较 1.4.1    检索的数据行 一般地,检索数据量大的一般使用聚集索引,因为聚集索引的叶子页面与数据页面在相同。相反,检索少量的数据可能非聚集索引更有利,但注意书签查找消耗资源的力度,不过可考虑覆盖索引解决这个问题。 1.4.2    数据是否排序 如果数据需要预先排序,需要使用聚集索引,若不需要预先排序就那就选择聚集索引。 1.4.3    索引键的宽度 索引键如果太宽,不仅会影响数据查询性能,还影响非聚集索引,因此,若索引键比较小,可以作为聚集索引,如果索引键够大,考虑非聚集索引,如果很大的话,可以用INCLUDE创建覆盖索引。 1.4.4    列更新的频度 列更新频率高的话,应该避免考虑所用非聚集索引,否则可考虑聚集索引。 1.4.5    书签查找开销 如果书签查找开销较大,应该考虑聚集索引,否则可使用非聚集索引,更佳是使用覆盖索引,不过得根据具体的查询语句而看。 1.5    覆盖索引 覆盖索引可显著减少查询的逻辑读次数,使用INCLUDE语句添加列的方式更容易实现,他不仅减小索引中索引列的数据,还可以减少索引键的大小,原因是包含列只保存在索引的叶子级别上,而不是索引的叶子页面。覆盖索引充当一个伪的聚集索引。覆盖索引还能够有效的减少阻塞和死锁的发生,与聚集索引类似,因为聚集索引值发生一次锁,非覆盖索引可能发生两次,一次锁数据,一次锁索引,以确保数据的一致性。覆盖索引相当于数据的一个拷贝,与数据页面隔离,因此也只发生一次锁。 1.6    索引交叉 如果一个表有多个索引,那么可以拥有多个索引来执行一个查询,根据每个索引检索小的结果集,然后就将子结果集做一个交叉,得到满足条件的那些数据行。这种技术可以解决覆盖索引中没有包含的数据。 1.7    索引连接 几乎是跟索引交叉类似,是一个衍生品种。他将覆盖索引应用到交叉索引。如果没有单个覆盖索引查询的索引而多个索引一起覆盖查询,SQL SERVER可以使用索引连接来完全满足查询而不需要查询基础表。 1.8    过滤索引 用来在可能没有好的选择性的一个或者多个列上创建一个高选择性的关键字组。例如在处理NULL问题比较有效,创建索引时,可以像写T-SQL语句一样加个WHERE条件,以排除某部分数据而检索。 1.9    索引视图 索引视图在OLAP系统上可能有胜算,在OLTP会产生过大的开销和不可操作性,比如索引视图要求引用当前数据库的表。索引视图需要绑定基础表的架构,索引视图要求企业版,这些限制导致不可操作性。 1.10    索引设计建议 1.10.1    检查WHERE字句和连接条件列 检查WHERE条件列的可选择性和数据密度,根据条件创建索引。一般地,连接条件上应当考虑创建索引,这个涉及到连接技术,暂时不说明。 1.10.2    使用窄的索引 窄的索引有可减少IO开销,读取更少量的数据页。并且缓存更少的索引页面,减少内存中索引页面的逻辑读取大小。当然,磁盘空间也会相应地减少。 1.10.3    检查列的唯一性 数据分布比较集中的列,种类比较少的列上创建索引的有效性比较差,如果性别只有男女之分,最多还有个UNKNOWN,单独在上面创建索引可能效果不好,但是他们可以为覆盖索引做出贡献。 1.10.4    检查列的数据类型 索引的数据类型是很重要的,在整数类型上创建的索引比在字符类型上创建索引更有效。同一类型,在数据长度较小的类型上创建又比在长度较长的类型上更有效。 1.10.5    考虑列的顺序 对于包含多个列的索引,列顺序很重要。索引键值在索引上的第一上排序,然后在前一列的每个值的下一列做子排序,符合索引的第一列通常为该索引的前沿。同时要考虑列的唯一性,列宽度,列的数据类型来做权衡。 1.10.6    考虑索引的类型 使用索引类型前面已经有较多的介绍,怎么选择已经给出。不再累述。 ------------------------- 回 27楼(板砖大叔) 的帖子 这两种都可以吧。看个人的喜好,不过微软现在的统一风格是下划线,比如表sys.all_columns/sys.tables,然后你再看他的列全是下划线连接,name     /object_id    /principal_id    /schema_id    /parent_object_id      /type    /type_desc    /create_date    /modify_date 我个人的喜好也是喜欢下划线。    

石沫 2019-12-02 01:34:30 0 浏览量 回答数 0

回答

放到数据库里,性能啥的不就别人给你解决了~###### 基本对的. 分段查找就行了. ###### django秒杀这题………… python原生带字典 ###### 简单说下鄙人的一点看法。 看到这个题目的时候,可以做一下简单的联想,我们可以想一下linux下文件目录的实现,就可以得到本题的思路。 可以利用B树系列数据结构来做,再加上一些缓存机制,就可以实现。 以上仅供参考。 ###### 实际情况我肯定放到数据库+索引,既省时又省力 做课题的话还是用树状结构来分组查询 ######字典树: http://baike.baidu.com/link?url=KE4Ctc6C0t9EUbHj5DxQ2wXSDczTjSiJTaFCrO8XI2-qasjO-dGn0cubOtmxbU9HBZ1_CztPpssMHbh7B2nV6_###### 这种情况用sqlite3 如果非要txt那么排序,做索引 感兴趣的话可以跳出txt,找些资料看看一些文件格式怎么设计的. ###### Boyer-Moore算法轻松搞定。其实量很小,以(k,v)存储在内存即可。。

kun坤 2020-06-06 23:22:42 0 浏览量 回答数 0

问题

mysqlloaddata无法检索的问题

nxycdl 2019-12-01 21:01:30 5997 浏览量 回答数 1

回答

场景 我用的数据库是mysql5.6,下面简单的介绍下场景 课程表: 数据100条 学生表: 数据70000条 学生成绩表SC 数据70w条 查询目的:查找语文考100分的考生 查询语句: select s.* from Student s where s.s_id in (select s_id from SC sc where sc.c_id = 0 and sc.score = 100 ) 执行时间:30248.271s 晕,为什么这么慢,先来查看下查询计划: 发现没有用到索引,type全是ALL,那么首先想到的就是建立一个索引,建立索引的字段当然是在where条件的字段。 先给sc表的c_id和score建个索引 CREATE index sc_c_id_index on SC(c_id); CREATE index sc_score_index on SC(score); 再次执行上述查询语句,时间为: 1.054s 快了3w多倍,大大缩短了查询时间,看来索引能极大程度的提高查询效率,建索引很有必要。很多时候都忘记建索引了,数据量小的的时候压根没感觉,这优化的感觉挺爽。 但是1s的时间还是太长了,还能进行优化吗,仔细看执行计划: 补充:这里有朋友问怎么查看优化后的语句,方法如下: 在命令窗口执行 有type=all 按照我之前的想法,该sql的执行的顺序应该是先执行子查询 耗时:0.001s 得到如下结果: 然后再执行 耗时:0.001s 这样就是相当快了啊,Mysql竟然不是先执行里层的查询,而是将sql优化成了exists子句,并出现了EPENDENT SUBQUERY,mysql是先执行外层查询,再执行里层的查询,这样就要循环70007*8次。 那么改用连接查询呢? 这里为了重新分析连接查询的情况,先暂时删除索引sc_c_id_index,sc_score_index 执行时间是:0.057s 效率有所提高,看看执行计划: 这里有连表的情况出现,我猜想是不是要给sc表的s_id建立个索引 在执行连接查询 时间: 1.076s,竟然时间还变长了,什么原因?查看执行计划: 优化后的查询语句为: 貌似是先做的连接查询,再进行的where条件过滤 回到前面的执行计划: 这里是先做的where条件过滤,再做连表,执行计划还不是固定的,那么我们先看下标准的sql执行顺序: 正常情况下是先join再进行where过滤,但是我们这里的情况,如果先join,将会有70w条数据发送join做操,因此先执行where过滤是明智方案 现在为了排除mysql的查询优化,我自己写一条优化后的sql 即先执行sc表的过滤,再进行表连接,执行时间为:0.054s 和之前没有建s_id索引的时间差不多,查看执行计划: 先提取sc再连表,这样效率就高多了,现在的问题是提取sc的时候出现了扫描表,那么现在可以明确需要建立相关索引 再执行查询: 执行时间为:0.001s,这个时间相当靠谱,快了50倍 执行计划: 我们会看到,先提取sc,再连表,都用到了索引。 那么再来执行下sql 执行时间0.001s 执行计划: 这里是mysql进行了查询语句优化,先执行了where过滤,再执行连接操作,且都用到了索引。 最近又重新导入一些生产数据,经测试发现,前几天优化完的sql执行效率又变低了 调整内容为SC表的数据增长到300W,学生分数更为离散。 先回顾下: show index from SC 执行sql 执行时间:0.061s,这个时间稍微慢了点 执行计划: 这里用到了intersect并集操作,即两个索引同时检索的结果再求并集,再看字段score和c_id的区分度,单从一个字段看,区分度都不是很大,从SC表检索,c_id=81检索的结果是70001,score=84的结果是39425。 而c_id=81 and score=84 的结果是897,即这两个字段联合起来的区分度是比较高的,因此建立联合索引查询效率将会更高。 从另外一个角度看,该表的数据是300w,以后会更多,就索引存储而言,都是不小的数目,随着数据量的增加,索引就不能全部加载到内存,而是要从磁盘去读取,这样索引的个数越多,读磁盘的开销就越大。 因此根据具体业务情况建立多列的联合索引是必要的,那么我们来试试吧。推荐阅读:37 个 MySQL 数据库小技巧! 执行上述查询语句,消耗时间为:0.007s,这个速度还是可以接收的 执行计划: 该语句的优化暂时告一段落 总结: mysql嵌套子查询效率确实比较低 可以将其优化成连接查询 连接表时,可以先用where条件对表进行过滤,然后做表连接(虽然mysql会对连表语句做优化) 建立合适的索引,必要时建立多列联合索引 学会分析sql执行计划,mysql会对sql进行优化,所以分析执行计划很重要 索引优化 上面讲到子查询的优化,以及如何建立索引,而且在多个字段索引时,分别对字段建立了单个索引。推荐阅读:MySQL数据库开发的 36 条军规! 后面发现其实建立联合索引效率会更高,尤其是在数据量较大,单个列区分度不高的情况下。 单列索引 查询语句如下: 索引: 分别对sex,type,age字段做了索引,数据量为300w,查询时间:0.415s 执行计划: 发现type=index_merge 这是mysql对多个单列索引的优化,对结果集采用intersect并集操作 多列索引 我们可以在这3个列上建立多列索引,将表copy一份以便做测试 查询语句: 执行时间:0.032s,快了10多倍,且多列索引的区分度越高,提高的速度也越多 执行计划: 最左前缀 多列索引还有最左前缀的特性,执行一下语句: 都会使用到索引,即索引的第一个字段sex要出现在where条件中 索引覆盖 就是查询的列都建立了索引,这样在获取结果集的时候不用再去磁盘获取其它列的数据,直接返回索引数据即可,如: 执行时间:0.003s ,要比取所有字段快的多 排序 时间:0.139s 在排序字段上建立索引会提高排序的效率 create index user_name_index on user_test(user_name) 最后附上一些sql调优的总结,以后有时间再深入研究: 列类型尽量定义成数值类型,且长度尽可能短,如主键和外键,类型字段等等 建立单列索引 根据需要建立多列联合索引 当单个列过滤之后还有很多数据,那么索引的效率将会比较低,即列的区分度较低 如果在多个列上建立索引,那么多个列的区分度就大多了,将会有显著的效率提高。 根据业务场景建立覆盖索引只查询业务需要的字段,如果这些字段被索引覆盖,将极大的提高查询效率 多表连接的字段上需要建立索引,这样可以极大提高表连接的效率 where条件字段上需要建立索引 排序字段上需要建立索引 分组字段上需要建立索引 Where条件上不要使用运算函数,以免索引失效

茶什i 2020-01-13 10:57:49 0 浏览量 回答数 0

问题

如何做数据库的实时备份??? 400 报错

爱吃鱼的程序员 2020-06-03 16:37:05 2 浏览量 回答数 1

回答

Mysql8是一个巨大的性能提升,对于二进制uuid做为主键有史诗级别的加强,牛逼大发了。######回复 @错觉 : ��,性能不输int整数,吊的不行。######二级制做主键 疯了吗######还不如直接用 postgresql ,更直接一些###### 可以更详细的对比下###### mysql8还真没研究过,性能提升真这么大的话是可以研究下###### 以上内容说和nosql存储方式就扯淡了######赞同######索引是个好东西######nosql 也得加索引啊###### nosql不是万能的,再说nosql太多了######速度相差这么大?看来需要升级了###### 对比虽然很简单,但是这么一说倒是可以去看看MySQL8 ,但是为什么要用数据库直接存放点赞,用缓存啊######是的,我也觉得,这个点是设计有问题。###### 到现在网上也没有怎么使用mysql8的NOSQL功能,好像是要收费的版本才能用?######你百度肯定不行,去官网看###### 但是楼主这种测试,明显有问题。######和 PostgreSQL 来个对比吧,哈哈哈

kun坤 2020-06-08 11:20:20 0 浏览量 回答数 0

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

a123456678 2019-12-02 02:50:52 0 浏览量 回答数 0

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

我的中国 2019-12-02 00:31:12 0 浏览量 回答数 0

回答

怎么都说不要用MySQL来做,每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。我给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

a123456678 2019-12-02 02:52:51 0 浏览量 回答数 0

回答

Re【质疑】RDS有什么好,理论上只会降低访问速度 这个主题有意思。 首先, 说到ECS IO能力不足,这是分布式文件存储当面最严峻的性能问题,我们一直在努力解决; 说到RDS,除了性能的优势,我们还有很多高级的功能; 1) 高可用,  你买一个实例,后面有两个实例(Master,Standby)。 30秒内DOWN机切换;      如果你自己去搭,那么你得买两个,当然也许你不需要高可用; 2) 自动备份 ;       不知道各位的数据库有没有备份;然后数据丢了, 或者删错表的时候是怎么找回来的?       RDS 有自动备份,而且7天内备份免费存储,         另外还有 数据回溯,  可以将你的数据回滚到7天内的任意时间点; 3) SQL 审计,SQL 统计 ; 4)  性能监控:近20个监控项;   5) 优化建议:表是不是太大, 索引够不够,索引是不是太多; 更多的可以看这里 http://help.aliyun.com/doc/view/13514878.html?spm=0.0.0.0.mpDgvp   总之,RDS 是一种 服务能力,你买到的不止是资源,有更多的高级功能。 用一用才知道;

rds-pd 2019-12-02 03:00:23 0 浏览量 回答数 0

回答

1、历史原因 varchar在MySQL 5.0.3之前只支持0-255byte,在MySQL 5.0.3之后才支持到0-65535byte 这里的255是字符的长度 2、varchar的最大长度 看一段代码 mysql> show variables like '%col%'; +---------------------------+-----------------+ | Variable_name | Value | +---------------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | | protocol_version | 10 | | slave_compressed_protocol | OFF | +---------------------------+-----------------+ 5 rows in set (0.00 sec) mysql> show char set; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | cp866 | DOS Russian | cp866_general_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | binary | Binary pseudo charset | binary | 1 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +----------+-----------------------------+---------------------+--------+ 40 rows in set (0.00 sec) mysql> create database testdbx DEFAULT CHARACTER SET latin1; mysql> use testdb; Database changed mysql> use testdbx; Database changed mysql> drop table if exists testa;create table testa (name varchar(65532)); mysql> drop table if exists testa;create table testa (name varchar(65533)); Query OK, 0 rows affected (0.01 sec) ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs mysql> drop table if exists testa;create table testa (name varchar(65533) not null); 总结如下 name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1) name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1) name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1) name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532 3、varchar物理存储 在物理存储上,varchar使用1到2个额外的字节表示实际存储的字符串长度(bytes)。如果列的最大长度小于256个字节,用一个字节表示(标识)。如果最大长度大于等于256,使用两个字节。 当选择的字符集为latin1,一个字符占用一个byte varchar(255)存储一个字符,使用2bytes物理空间存储数据实际数据长度和数据值。 varchar(256)存储一个字符,使用2bytes表示实际数据长度,一共需要3bytes物理存储空间。 varchar对于不同的RDBMS引擎,有不通的物理存储方式,虽然有统一的逻辑意义。对于mysql的不同存储引擎,其实现方法与数据的物理存放方式也不同。 4、InnoDB中的varchar InnoDB中varchar的物理存储方式与InnoDB使用的innodb_file_format有关。 早期的innodb_file_forma = Antelope;支持redundant和compact两种row_format5.5开始或者InnoDB1.1,可以使用一种新的file format = Barracuda;Barracuda兼容Redundant,另外还支持dynamic和compressed两种row_format当innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT。innodb的聚集索引(cluster index)仅仅存储varchar、text、blob字段的前768个字节,多余的字节存储在一个独立的overflow page中,这个列也被称作off-page。768个字节前缀后面紧跟着20字节指针,指向overflow pages的位置。 另外,在innodb_file_format=Antelope情况下,InnoDB中最多能存储10个大字段(需要使用off-page存储)。innodbd的默认page size为16KB,InnoDB单行的长度不能超过16k/2=8k个字节,(768+20)*10 < 8k。 当innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或者 COMPRESSED innodb中所有的varchar、text、blob字段数据是否完全off-page存储,根据该字段的长度和整行的总长度而定。对off-page存储的列,cluster index中仅仅存储20字节的指针,指向实际的overflow page存储位置。如果单行的长度太大而不能完全适配cluster index page,innodb将会选择最长的列作为off-page存储,直到行的长度能够适配cluster index page。 5、MyISAM中的varchar 对于MyISAM引擎,varchar字段所有数据存储在数据行内(in-line)。MyISAM表的row_format也影响到varchar的物理存储行为。 MyISAM的row_format可以通过create或者alter sql语句设为fixed和dynamic。另外可以通过myisampack生成row_format=compresse的存储格式。 当MyISAM表中不存在text或者blob类型的字段,那么可以把row_format设置为fixed(也可以为dynamic),否则只能为dynamic。 当表中存在varchar字段的时候,row_format可以设定为fixed或者dynamic。使用row_format=fixed存储varchar字段数据,浪费存储空间,varchar此时会定长存储。row_format为fixed和dynamic,varchar的物理实现方式也不同(可以查看源代码文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之间发生转换的时候,varchar字段的物理存储方式也将会发生变化。 总结 : 1、存储2^8 = 256 / overflow pages / 历史原因 3、varchar不一定比char慢 3、如果有大字段使用text,请拆表 4、varchar建立索引的时候,前面20个字符以内即可 5、其实该怎么用还要怎么用 varchar(30) 、 vachar(300)等 参考资料:http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html 1、历史原因varchar在MySQL 5.0.3之前只支持0-255byte,在MySQL 5.0.3之后才支持到0-65535byte这里的255是字符的长度 2、varchar的最大长度看一段代码 mysql> show variables like '%col%'; +---------------------------+-----------------+ | Variable_name | Value | +---------------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database | utf8_general_ci | | collation_server | utf8_general_ci | | protocol_version | 10 | | slave_compressed_protocol | OFF | +---------------------------+-----------------+ 5 rows in set (0.00 sec) mysql> show char set; +----------+-----------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+-----------------------------+---------------------+--------+ | big5 | Big5 Traditional Chinese | big5_chinese_ci | 2 | | dec8 | DEC West European | dec8_swedish_ci | 1 | | cp850 | DOS West European | cp850_general_ci | 1 | | hp8 | HP West European | hp8_english_ci | 1 | | koi8r | KOI8-R Relcom Russian | koi8r_general_ci | 1 | | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | latin2 | ISO 8859-2 Central European | latin2_general_ci | 1 | | swe7 | 7bit Swedish | swe7_swedish_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | hebrew | ISO 8859-8 Hebrew | hebrew_general_ci | 1 | | tis620 | TIS620 Thai | tis620_thai_ci | 1 | | euckr | EUC-KR Korean | euckr_korean_ci | 2 | | koi8u | KOI8-U Ukrainian | koi8u_general_ci | 1 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | greek | ISO 8859-7 Greek | greek_general_ci | 1 | | cp1250 | Windows Central European | cp1250_general_ci | 1 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | latin5 | ISO 8859-9 Turkish | latin5_turkish_ci | 1 | | armscii8 | ARMSCII-8 Armenian | armscii8_general_ci | 1 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 | | cp866 | DOS Russian | cp866_general_ci | 1 | | keybcs2 | DOS Kamenicky Czech-Slovak | keybcs2_general_ci | 1 | | macce | Mac Central European | macce_general_ci | 1 | | macroman | Mac West European | macroman_general_ci | 1 | | cp852 | DOS Central European | cp852_general_ci | 1 | | latin7 | ISO 8859-13 Baltic | latin7_general_ci | 1 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | | cp1251 | Windows Cyrillic | cp1251_general_ci | 1 | | utf16 | UTF-16 Unicode | utf16_general_ci | 4 | | utf16le | UTF-16LE Unicode | utf16le_general_ci | 4 | | cp1256 | Windows Arabic | cp1256_general_ci | 1 | | cp1257 | Windows Baltic | cp1257_general_ci | 1 | | utf32 | UTF-32 Unicode | utf32_general_ci | 4 | | binary | Binary pseudo charset | binary | 1 | | geostd8 | GEOSTD8 Georgian | geostd8_general_ci | 1 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | +----------+-----------------------------+---------------------+--------+ 40 rows in set (0.00 sec) mysql> create database testdbx DEFAULT CHARACTER SET latin1; mysql> use testdb; Database changed mysql> use testdbx; Database changed mysql> drop table if exists testa;create table testa (name varchar(65532)); mysql> drop table if exists testa;create table testa (name varchar(65533)); Query OK, 0 rows affected (0.01 sec) ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. This includes storage overhead, check the manual. You have to change some columns to TEXT or BLOBs mysql> drop table if exists testa;create table testa (name varchar(65533) not null); 总结如下 name varchar(100) not null will be 1 byte (length) + up to 100 chars (latin1) name varchar(500) not null will be 2 bytes (length) + up to 500 chars (latin1) name varchar(65533) not null will be 2 bytes (length) + up to 65533 chars (latin1) name varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532 3、varchar物理存储 在物理存储上,varchar使用1到2个额外的字节表示实际存储的字符串长度(bytes)。如果列的最大长度小于256个字节,用一个字节表示(标识)。如果最大长度大于等于256,使用两个字节。 当选择的字符集为latin1,一个字符占用一个byte varchar(255)存储一个字符,使用2bytes物理空间存储数据实际数据长度和数据值。 varchar(256)存储一个字符,使用2bytes表示实际数据长度,一共需要3bytes物理存储空间。 varchar对于不同的RDBMS引擎,有不通的物理存储方式,虽然有统一的逻辑意义。对于mysql的不同存储引擎,其实现方法与数据的物理存放方式也不同。 4、InnoDB中的varchar InnoDB中varchar的物理存储方式与InnoDB使用的innodb_file_format有关。 早期的innodb_file_forma = Antelope;支持redundant和compact两种row_format5.5开始或者InnoDB1.1,可以使用一种新的file format = Barracuda;Barracuda兼容Redundant,另外还支持dynamic和compressed两种row_format当innodb_file_format=Antelope,ROW_FORMAT=REDUNDANT 或者COMPACT。innodb的聚集索引(cluster index)仅仅存储varchar、text、blob字段的前768个字节,多余的字节存储在一个独立的overflow page中,这个列也被称作off-page。768个字节前缀后面紧跟着20字节指针,指向overflow pages的位置。 另外,在innodb_file_format=Antelope情况下,InnoDB中最多能存储10个大字段(需要使用off-page存储)。innodbd的默认page size为16KB,InnoDB单行的长度不能超过16k/2=8k个字节,(768+20)*10 < 8k。 当innodb_file_format=Barracuda, ROW_FORMAT=DYNAMIC 或者 COMPRESSED innodb中所有的varchar、text、blob字段数据是否完全off-page存储,根据该字段的长度和整行的总长度而定。对off-page存储的列,cluster index中仅仅存储20字节的指针,指向实际的overflow page存储位置。如果单行的长度太大而不能完全适配cluster index page,innodb将会选择最长的列作为off-page存储,直到行的长度能够适配cluster index page。 5、MyISAM中的varchar 对于MyISAM引擎,varchar字段所有数据存储在数据行内(in-line)。MyISAM表的row_format也影响到varchar的物理存储行为。 MyISAM的row_format可以通过create或者alter sql语句设为fixed和dynamic。另外可以通过myisampack生成row_format=compresse的存储格式。 当MyISAM表中不存在text或者blob类型的字段,那么可以把row_format设置为fixed(也可以为dynamic),否则只能为dynamic。 当表中存在varchar字段的时候,row_format可以设定为fixed或者dynamic。使用row_format=fixed存储varchar字段数据,浪费存储空间,varchar此时会定长存储。row_format为fixed和dynamic,varchar的物理实现方式也不同(可以查看源代码文件field.h和field.cc),因而myisam的row_format在fixed和dynamic之间发生转换的时候,varchar字段的物理存储方式也将会发生变化。 总结 : 1、存储2^8 = 256 / overflow pages / 历史原因 3、varchar不一定比char慢 3、如果有大字段使用text,请拆表 4、varchar建立索引的时候,前面20个字符以内即可 5、其实该怎么用还要怎么用 varchar(30) 、 vachar(300)等 参考资料:http://dev.mysql.com/doc/refman/5.5/en/column-count-limit.html

西秦说云 2019-12-02 01:33:17 0 浏览量 回答数 0

回答

colum1  column2   c  c3 c5 c_time 这样应该就行了######索引多了引起的是insert\update慢,以及索引的维护成本、占用存储空间,看需求哦######@mahone : ORDER BY 字段也可走索引。不过mysql的索引及查询优化器功能较差,没什么可折腾的~######这么多字段,会不会索引数据量有点大?性能会不会也不是很好?请教,order by的字段也要建索引是么?###### 引用来自“fzxu_05”的答案 colum1  column2   c  c3 c5 c_time 这样应该就行了 好 回家时候试试  ######试完了给了结论,参考学习下...谢谢...###### SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''  ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10 这样的查询悲剧了 如果把in换成 =110 就很快 不知道怎么优化 ###### 引用来自“十一文”的答案 SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''  ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10 这样的查询悲剧了 如果把in换成 =110 就很快 不知道怎么优化 按照网上的 换成join 也不行 SELECT `news_id`, `news_title`, `news_keywords`, `news_summary`, `news_imgname`, `news_publishtime`, `news_filepath`, `news_author`, `news_editor`, `news_onTop`, `news_newTop`, `news_CNTop`  FROM `tb_news` a inner join tb_menu b on a.menu_id=b.menu_id  WHERE  `news_isapproval` = '1'  AND b.`menu_fid` = 113 AND `news_imgname` = ''    ORDER BY `news_newTop` desc, `news_CNTop` desc, `news_publishtime` desc LIMIT 10   说明 索引现在是 menu_id news_isapproval news_imgname news_newTop news_CNTop news_publishtime ######试试索引。tb_menu(menu_id,menu_fid); tb_news(menu_id,news_isapproval,news_imgname,news_newTop, news_CNTop, news_publishtime)######定 等人回答!######囧 还是没人回答吗?######这个索引基本在两个就可以满足 应该所有的时间花费在排序上 用explain把你的语句分析下看下贴出来 ######的确 是所有时间都花在排序上 但是我不知道怎么办 囧######因为C3,C5重复率极高,那么就不要在上边建索引了,重复率很高的建索引反而不胜全表扫描,C_time,column1,column2,c这些如果重复率不高的话,可以保留索引,另外不要用select *这样的形式

kun坤 2020-06-03 14:08:19 0 浏览量 回答数 0

问题

我想请问一个关于文件结构设计的问题,网上完全搜索不到这方面的东西:报错

kun坤 2020-06-06 16:50:27 0 浏览量 回答数 1

回答

这得看数据量了,几十万以下,加个索引就可以搞定了。几十百万以上的话,无论是update还是delete都是不推荐的,一般用ctas建临时表,再将原本未更新的数据补进临时表,删除原表,把临时表改名为原表名。 ######看一下执行计划,是不是没走索引######哈,谢谢回答,是那个来源表里没索引,我已经加了,现在很快就能执行完,嘿嘿,不过你回答的晚了。我已经设置了最佳答案咯。###### @宏哥 知道这大龄屌丝数据库方面很就X,怎么就是在上面提问里面@不到呢,继续 @宏哥 一下。 ###### 你这语句能执行? c_row哪来的 pdate_date是哪来的 还有就是没有执行计划没办法分析的 ###### 引用来自“IdleMan”的答案 你这语句能执行? c_row哪来的 pdate_date是哪来的 还有就是没有执行计划没办法分析的 这2个你就可以当常量吧,因为这个是从存储过程里面直接copy过来的,但逻辑就是这样的没变。。 ######is not null? 建议看一下解释计划###### 引用来自“JackyYeong”的答案 is not null? 建议看一下解释计划 上面一个用这是,是因为我觉得这么些2个表应该是全连接,而实际是要更新的表 a 的每一行记录并不能在数据源表 b 中对应到数据,让我不想因为对应不到而把 a 中的更新成null,所以才这么写。第二个语句本身是不需要在这儿这么判断的,为了达到和第一个一样的目的,应该在where后面exists前面的更新条件,这样更慢,对吧? ###### 为什么你不拆开来分析一下到底是哪个条件导致这么慢? 建议你把中间select语句的执行计划拿出来看一下~还有表的结构跟表大小~

kun坤 2020-06-10 09:34:57 0 浏览量 回答数 0

回答

百度百科中对Base64有一个很好的解释:“Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法”。         什么是“可打印字符”呢?为什么要用它来传输8Bit字节码呢?在回答这两个问题之前我们有必要来思考一下什么情况下需要使用到Base64?Base64一般用于在HTTP协议下传输二进制数据,由于HTTP协议是文本协议,所以在HTTP协议下传输二进制数据需要将二进制数据转换为字符数据。然而直接转换是不行的。因为网络传输只能传输可打印字符。什么是可打印字符?在ASCII码中规定,0~31、127这33个字符属于控制字符,32~126这95个字符属于可打印字符,也就是说网络传输只能传输这95个字符,不在这个范围内的字符无法传输。那么该怎么才能传输其他字符呢?其中一种方式就是使用Base64。         Base64,就是使用64个可打印字符来表示二进制数据的方法。Base64的索引与对应字符的关系如下表所示: 也就是说,如果将索引转换为对应的二进制数据的话需要至多6个Bit。然而ASCII码需要8个Bit来表示,那么怎么使用6个Bit来表示8个Bit的数据呢?6个Bit当然不能存储8个Bit的数据,但是46个Bit可以存储38个Bit的数据啊!如下表所示: 可以看到“Son”通过Base64编码转换成了“U29u”。这是刚刚好的情况,3个ASCII字符刚好转换成对应的4个Base64字符。但是,当需要转换的字符数不是3的倍数的情况下该怎么办呢?Base64规定,当需要转换的字符不是3的倍数时,一律采用补0的方式凑足3的倍数,具体如下表所示: 每6个Bit为一组,第一组转换后为字符“U”,第二组末尾补4个0转换后为字符“w”。剩下的使用“=”替代。即字符“S”通过Base64编码后为“Uw==”。这就是Base64的编码过程。

问问小秘 2020-04-30 16:51:05 0 浏览量 回答数 0

问题

云数据库 MongoDB 版热门回答01

问问小秘 2019-12-01 19:51:57 23 浏览量 回答数 1

问题

【精品问答】云数据库十大经典案例总结和反思

问问小秘 2020-01-02 13:09:08 8 浏览量 回答数 1

回答

每秒200并发对MySQL来说不算啥难事啊。而且换成Redis、Memcached,持久化姑且不说,业务代码和运维部署量都不小。给你几个建议,尽量让你的运维部署和业务代码改动小一些。你可以做主从分离,不要在一个库上高并发插入同时还做大量统计运算。分离之后,查询在从库是做(甚至是导入Hive之类专门的分布式系统来做),主库上可以去掉索引,提升插入的性能。这个方法,业务代码几乎不用任何改动(改个数据库配置文件就好了)。MySQL运维部署也可以选个业务低谷在线做。如果你可以接受少量业务代码(PHP)改动,还有两个建议:分库,分表,每个表的数据总量小了,操作起来性能会好一些,特别是对从库的MyISAM表。你插入之前可能会有一些查询,例如查询这个IP在不在库里,以前统计过没。使用HandlerSocket插件,绕过SQL Parser,直接操作存储文件。如果业务上有可能,还可以使用bulk insert(批量插入)。MySQL InnoDB还推出了类似HandlerSocket的InnoDB NoSQL Plugin,用的memcached协议,共享InnoDB Buffer,再也不用操心MySQL和Memcached之前怎么维护数据一致性了。

蛮大人123 2019-12-02 01:43:33 0 浏览量 回答数 0

问题

荆门开诊断证明-scc

游客5k2abgdj3m2ti 2019-12-01 22:09:00 1 浏览量 回答数 0

问题

【Java问答学堂】8期 es 的分布式架构原理能说一下么(es 是如何实现分布式的啊)?

剑曼红尘 2020-04-26 14:53:59 64 浏览量 回答数 2

问题

阿里云服务器 如何处理网站高并发流量问题?(含教程)

元芳啊 2019-12-01 21:54:35 1511 浏览量 回答数 1

回答

当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; ###### 引用来自“vvtf”的评论 当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 临时表方案靠谱。###### 首先,判断重复用数据库的uniq来做(程序里处理uniq的报错),而不是自己写代码另外去判断。 大数据量的导入建议用csv,读一行导一行,内存占用小。如果非要用excel,记得服务器内存要设置大点。 ######你说的那两个字段加入唯一约束 . 然后开启事务,循环插入,如果插入失败,则改为更新(或你自己的逻辑). 这样快,但肯定很消耗CPU. ######为什么不在list里面去重,再一次导入######这样数据库只需要批量插入的时候维护一次索引,如果修改的其他字段没建索引,那么update是不需要维护索引的######看能不能插入之前拆出2个list,一个是重复的,一个是不重复的(这样拆之前需要select……for update,防止其他事务修改数据)###### 引用来自“death_rider”的评论 为什么不在list里面去重,再一次导入 赞同。具体设计问题不明确不好给意见。不过系统和算法设计中有点是可以肯定的:逻辑处理和数据载入尽量分开。 在单纯的算法设计中,往往不会去考虑数据迁移的成本,这是比较理科的分析方式,而在系统开发过程中,数据迁移的成本是必须要考虑的,这是工程化的必然。 数据迁移,这里是广义上的,包括,数据的转移,从磁盘到外部存储(主板上所谓的内存),从外部存储到片内存储(soc,cpu的内部cache,差异在于无需外部总线);也包括,通过网络在不同处理设备之间的转移;同时还包括数据的结构调整,如数据清洗在逻辑层面的工作。 楼主应该考虑数据的预清洗或后处理。当然具体用哪种更合适,还要自己根据数据的来源,数据之间的关联性,数据处理的实时性等要求来判断。 哈,反正是个系统设计层面的工作。不是工具选择层面的事务。 ######回复 @首席打酱油 : 把需要比对的,做md5等散列数据,可把大概率数据测出来。只有命中时才进行比对。这些工作,需要额外的数据组织,同时需要额外的编程。这些数据过滤的算法,如果用c我看不出有啥太大计算量。######目测楼主说的不能重复不仅是指Excle中的数据不能重复,而且还要Excel中的数据和现有数据库中的数据不能重复,所以不能单纯的把Excle中的数据加载到List中内存去重###### 引用来自“vvtf”的评论 当然要批量导入啊。 excel转换成特定SQL文件然后导入数据库。 这里去重,可以考虑一张临时表。 然后插入数据可以使用如mysql的 ignore : insert ignore into table_main(id,phone,other)  select id,phone,other from table_temp_uuid; 一般怎么把EXCEL转换成SQL文件呢?######如果你的excel本来就是符合load data infile的文件格式, 都不需要解析的。######就是解析excel啊。所以这个方案的耗时也就是解析excel这里。当然这可能也浪费不了多少时间的。 我这里是对MySQL的方案。 解析成对应的MySQL能解析的。比如load data infile。 或者批量insert也行。 然后source。6W条瞬间插入的。######数据直接用com接口导出(服务器处理),分布式处理也行,但是不做任何处理,极限速度,10w体积很小的,1m?连1个高清png的大小都没有,数据也是可以压缩的,重复的数据会压缩很多,上传和带宽不是瓶颈,主要是数据逻辑处理和数据库瓶颈,你处理的时候解析到内存,一个瓶颈,倒入数据库又temp table,还是内存,数据库的内存,又一个瓶颈######你要懂服务器编程才行啊,很多处理单机导出数据还可以,服务器就不这么处理了,还有就是数据库,知道temp table,stor procedure,导入导出,那是数据库初级而已######主要问题在“ Excel文档转List花费4m”,只能异步了。

kun坤 2020-06-08 19:23:25 0 浏览量 回答数 0

问题

ES 的分布式架构原理能说一下么(ES 是如何实现分布式的啊)?【Java问答学堂】26期

剑曼红尘 2020-05-26 20:30:13 41 浏览量 回答数 1
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 企业信息查询 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站