当前位置:首页 » 编程语言 » sql索引varchar
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

sql索引varchar

发布时间: 2022-04-02 05:59:39

‘壹’ 如何修改数据库所有表varchar至nvarchar而不需要删除索引

altertableAmodifym(number(10));里面的10是我自己写的,就是你原来varchar2的长度,你在实际执行时修改一下。

‘贰’ db2查询条件(varchar类型)不带引号与索引有没有关系

跟索引没有关系。

sql语句、或者表结构、或者记录值的问题。

post你的实例、证据上来,别空说。

‘叁’ varchar(500)换成varchar(50)有什么影响

一般主键或者索引都有一个最大长度,对于sql server 2005来说,最大的长度是900字节,如果字段类型是varchar(500),那么可以放500个字符,如果是gbk的字符,那么就要占用1000个字节,如果将这个字段设置为主键,就超过了900字节的长度。
你讲varcahr(500)换成了varchar(50)后,此字段最大的占用字节数是100,小于900,所以就可以设置为主键了。
至于影响,就是如果你要在A1字段中存超过50个字符,就会被截断。如果你A1字段中存的字符不会超过50个字符,那么没有任何影响。

‘肆’ mysql怎么添加索引sql语句

工具:mysql数据库创建一个user的表里边的字段
1.普通索引 添加INDEX
ALTER TABLE `table_name` ADD INDEX index_name ( `column` )

下面演示下给user表的name字段添加一个索引

2.主键索引 添加PRIMARY KEY
ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` )

3.唯一索引 添加UNIQUE
ALTER TABLE `table_name` ADD UNIQUE ( `column` )

4.全文索引 添加FULLTEXT
ALTER TABLE `table_name` ADD FULLTEXT ( `column`)

5.如何添加多列索引
ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3` )

‘伍’ mysql varchar索引和int索引性能哪个好

性能相当,mysql中区别性能的是采用哪种索引方式,而不是索引的数据类型。
MySQL的btree索引和hash索引的区别
hash 索引结构的特殊性,其检索效率非常高,索引的检索可以一次定位,不像btree(B-Tree)索引需要从根节点到枝节点,最后才能访问到页节点这样多次的IO访问,所以 hash 索引的查询效率要远高于 btree(B-Tree) 索引。

虽然 hash 索引效率高,但是 hash 索引本身由于其特殊性也带来了很多限制和弊端,主要有以下这些。
(1)hash 索引仅仅能满足=,<=>,IN,IS NULL或者IS NOT NULL查询,不能使用范围查询。
由于 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 值相关联。这样要定位某一条记录时就会非常麻烦,会浪费多次表数据的访问,而造成整体性能低下

‘陆’ SQL中 NVARCHAR 和 VARCHAR 两者之间的优势与劣势!!

varchar在SQL Server中是采用单字节来存储数据的,nvarchar是使用Unico来存储数据的.中文字符存储到SQL Server中会保存为两个字节(一般采用Unico编码),英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果字段 的类型为nvarchar,则会占用两个字节.
正常情况下,我们使用varchar也可以存储中文字符,但是如果遇到操作系统是英文操 作系统并且对中文字体的支持不全面时, 在SQL Server存储中文字符为varchar就会出现乱码(显示为??).而且正常情况下,主机都会支持中文的环境,所以如果使用varchar来存储数 据,在开发阶段是发现不了的.多数情况下,在布署的时候也不会有问题.
但是!如果布署的主机是英文操作系统,并且不支持中文环境,那问 题就出来了.所有的varchar字段在存储中文的时候都会变成乱码(显示为??).而且一般情况下你不会知道这是因为你采用了错误的数据类型来存储所造 成的,你会试着去装中文字体,试着去设置操作系统的语言环境...这些都不能解决问题,唯一能解决问题的是把数据库字段的类型个性为nvarchar(或 者nchar).对项目管理比较熟悉的朋友应该都知道,到布署阶段再来修改数据库是一个很恐怖的事情.
使用nvarchar的另一个非常好处就是在判断字符串的时候可以不需要考虑中英文两种字符的差别.
当然,使用nvarchar存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的.
所以在Design的时候应该尽量使用nvarchar来存储数据.只有在你确保该字段不会保存中文的时候,才采用varchar来存储.
1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。
2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。
从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。
3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。
4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。
所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar

‘柒’ mysql 数据库里搜索商品名称,但是name(varchar)字段没建立索引,用什么方法效率最高

单独的索引和复合索引的索引。单一索引,只包含单个列,一个表可以有多个单独的索引,而不是索引的组合的索引。综合指数,即包含多个列的电缆。
MySQL索引的类型包括:

(1)一般指数

这是最基本的索引,它没有任何限制。它创造了几种方法:

◆创建一个索引

CREATE INDEX INDEXNAME ON mytable的(用户名(长度));

如果CHAR,VARCHAR类型,长度可以小于的实际长度场,如果是BLOB和TEXT类型,必须指定长度,下同。

◆表结构

ALTER mytable的ADD INDEX [INDEXNAME]开(用户名(长度))

◆当您创建一个表直接指定

CREATE TABLE mytable的(ID INT NOT NULL ,用户名VARCHAR(16)NOT NULL,索引[INDEXNAME](用户名(长度)));

删除索引的语法:

DROP INDEX [INDEXNAME] ON mytable的;

(2)唯一索引

它类似于以前的一般指标,不同的是:索引列的值必须是唯一的,但是允许空值。如果它是一个综合指数相结合,列值??必须是唯一的。它创造了几种方法:

◆创建一个索引

CREATE UNIQUE INDEX INDEXNAME ON mytable的(用户名(长度))

◆表结构

ALTER mytable的ADD UNIQUE [INDEXNAME]开启(用户名(长度))

◆当您创建一个表直接指定

CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL,UNIQUE [INDEXNAME](用户名(长度))) ;

(3)主键索引

这是一个特殊的唯一索引不允许空值。一般的时候同时创建主键索引的表的结构:

CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL,PRIMARY KEY(ID));
>当然,你可以使用ALTER命令。请记住:一个表只能有一个主键。

(4)综合指数

对于图像的对比度和组合索引单列索引,添加更多的字段的表:

CREATE TABLE mytable的(ID INT NOT NULL,用户名VARCHAR(16)NOT NULL ,城市VARCHAR(50)NOT NULL,年龄INT NOT NULL);

为了进一步榨取MySQL的效率,就要考虑建立组合索引。是的名称,城市,年龄建成一个索引,其中:

ALTER TABLE mytable的ADD INDEX name_city_age(名(10),城市,年龄);

建立表时,16 usernname长度,其中10。这是因为在正常情况下不超过10名,这将加快查询速度索引的长度,该指数将减少文件大小,提高INSERT的更新速度。

如果您创建的每个usernname一个单独的索引,城市,年龄,所以该表有三个单独的索引,上面的查询和索引的组合效率会有很大的不同,远远超过我们的组合索引少。虽然此时有了三个索引,但MySQL只可以使用它们认为这似乎是最有效的单一指标。

建立这样的组合索引,其实是三组相当于建立了以下综合指数:

usernname,城市,年龄usernname,城市usernname

为什么没有城市,年龄该做组合索引?它是一个综合指数,因为MySQL的结果“最左前缀”一个。这只是意味着,左侧只有从一开始的组合。不仅包含了这三个疑问将在综合指数中使用,下面的几个SQL就会使用这个组合索引:

SELECT * FROM mytable的WHREE用户名=“管理员”和城市=“郑州”SELECT * FROM mytable的WHREE用户名= “管理员”

接下来的几个未使用:

SELECT * FROM mytable的WHREE年龄为20及城市=“郑州”SELECT * FROM mytable的WHREE城市=“郑州”

(5)索引时间

在这里,我们已经学会了建立索引,那么我们需要在什么情况下创建索引?通常,当连接列和出现在需要建立索引,但也不完全如此,因为MySQL只<,,> =,BETWEEN,IN,LIKE,有的时候会使用索引。例如:

选择t.Name FROM mytable的吨LEFT JOIN mytable的M于t.Name = m.username WHERE m.age = 20和m.city ='郑州'

这时候就需要城市与年龄索引,由于userame mytable的表也出现在JOIN子句中,也有必要建立索引。

只是它需要像索引的时候一定提及。因为在一开始通配符%和_的查询,MySQL不会使用索引。例如,下面的语句将使用索引:

SELECT * FROM mytable的其中username like'admin%'

下一句不会使用:

SELECT * FROM mytable的WHEREt名称LIKE'% admin的

因此,更应注意使用LIKE差异。

(6)指数

的不足之处上面是说使用索引的好处,但过量使用索引将会造成滥用。因此,该指数也有其缺点:

◆虽然索引大大提高了查询速度,但会降低更新表,如表的INSERT,UPDATE的速度和DELETE。因为当你更新表,MySQL只保存数据,而且还节省大约索引文件。

◆建立索引会占用磁盘空间的索引文件。通常这个问题不是太严重,但如果你是在一个大表创建各种复合索引,索引文件将很快扩大。

指数只是其中的一个因素,以提高效率,如果你有大量的数据的MySQL表,你需要花时间去研究建立最佳的索引,或优化查询。

(7)使用索引

注意事项使用索引时,下面的一些技巧和注意事项:??

◆索引不会包含NULL值的列只要列中包含 BR />有NULL值?将不会被包含在索引中,复合索引,只要有包含NULL值的列,那么这个列是此复合索引无效。所以,我们不要让默认字段为NULL的数据库设计。

就用短串联指数指标,如果可能的话,你应该指定一个前缀长度。例如,如果一个CHAR(255)列,如果在前10或20个字符之内,多个值?是独一无二的,那就不要索引整个列。短索引不仅可以提高查询速度而且可以节省磁盘空间和I / O操作。

◆索引列排序

MySQL查询只使用一个索引,因此如果where子句已在索引中使用,然后按列的顺序将不会使用索引。因此,不要使用默认的数据库排序时排序操作即可满足要求;尽量不要包含多个排序列,如果需要的话最好创建这些列的一个综合指数。

◆like语句

在正常情况下运行不鼓励使用类似的操作,如果非使用不可,如何使用也是一个问题。如“%AAA%”不会使用索引而不是像“AAA%”可以使用索引。

◆不要在列选择*从用户那里YEAR(录入)<2007年

操作将在每个行上进行的,这将导致失败而进行全表索引扫描,所以我们可以改变

选择*从用户那里录入时间<'2007-01-01';

◆不使用NOT IN和>

更多操作上的MySQL索引类型进行了介绍。
转移: http://www.zbite.com/action-viewthread - TID-33491

‘捌’ oracle中俩数据库用户A和B。字段均为varchar2类型,都建有索引以下两个查询sql,速度为啥不一样

差一个引号 可能导致2个查询 完全不一样的执行计划, 在Oracle里差一个符号 一个空格都可能造成解析为不同的执行计划,最后的性能天差地别, 这是很正常的。