索引的作用及优缺点
创建索引能大大提高系统性能
优点:
1. 通过创建唯一性索引,可以保证数据库表中的每一行数据的唯一性。
2. 加快数据检索的速度,这也是创建索引的最主要原因。
3. 加快表与表之间的连接,在实现表的参考完整性方面特别有意义。
4. 在使用分组和排序子句进行检索时,可以减少分组和排序的时间。
5. 通过使用索引,可以再查询的过程中,使用优化隐藏器,提高系统的性能。
缺点:
1. 创建索引和维护索引需要时间,这种时间随着数据量的增加而增加。
2. 索引需要占物理空间,除了数据表占数据空间之外,每个索引还要占物理空间,如果要建立聚簇索引,需要的空间更大。
3. 当对表中的数据进行增加,删除和修改的时候,索引也要动态的维护,这就降低了数据的维护速度。
哪些列应该创建索引?
1. 在经常要搜索的列上,可以加快搜索的速度。
2. 在作为主键的列上,强制该列的唯一性和组织表中数据的排列结构。
3. 在经常用在连接的列上,这些列主要是一些外键,可以加快连接的速度。
4. 在经常需要根据范围进行搜索的列上,因为索引已经排序,其指定的范围是连续的。
5. 在经常需要进行排序的列上创建索引,因为索引已经排序,这样查询可以利用索引的排序,加快排序查询时间。
6. 在经常使用在where子句中的列上创建索引,加快条件的判断速度。
哪些列不应该创建索引?
1. 对于那些在查询中很少使用或者参考的列,不应该创建索引。这是因为,既然这些列很少使用到,因此有索引或者无索引,并不能提到查询速度。相反,由于增加了索引,反而降低了系统的维护速度和增大了空间需求。
2. 对于那些很少数据值的列,也不应该增加索引。这是因为,由于这些列的取值很少,例如人事表的性别列,在查询的结果中,结果集的数据行占了表中数据行的很大比例,即需要在表中搜索的数据行的比例很大。增加索引,并不能明显加快检索速度。
3. 对应那些定义为text, image和bit数据类型的类不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少。
4. 当修改性能远远大于检索性能时,不应该创建索引。这是因为,修改性能和检索性能是互相矛盾的。当增加索引时,会提高检索性能,但是会降低修改性能。当减少索引时,会提高修改性能,降低检索性能。因此,当修改性能远远大于检索性能时,不应该创建索引。
索引的类型
Mysql常用的索引有:主键索引,唯一索引,普通索引,组合索引,全文索引
各个索引的创建方式
Primary Key(主键索引):alter table table_name add primary key ('column')
Unique(唯一索引):alter table table_name add unique ('column')
Index(普通索引):alter table table_name add index index_name ('column')
FullText(全文索引):alter table table_name add fulltext ('column')
组合索引:alter table table_name add index index_name ('column1', 'column2','column3')
Mysql各种索引的区别
1. 普通索引(index):最基本的索引,没有任何限制
2. 唯一索引(Unique):与“普通索引”类似,不同的是:索引列的值必须是唯一的,可以为空
3. 主键索引(Primary):特殊的唯一索引,不允许有空值
4. 全文索引(FullText):MySql 5.6 以后,既可以用于MyISAM,InnoDB存储引擎都可以。用于搜索很长一篇文章的时候,效果最好
5. 组合索引:为了更多的提高MySql效率可建立组合索引,遵循“最左前缀”原则
索引失效的几种情况
1. 前导模糊查询不能利用索引(like '%XXX'或者like '%XXX%')(在后面不会)
2. 如果是组合索引的话,如果不按照索引的顺序进行查找,则会进行全表查询
3. 条件中有or (如果sql中有or可以换成union)
4. where判断条件有is null或者is not null (可以给字段设置默认值,确保不会有null存进去)
5. in和not in要慎用,对于连续的数值,能用between and就不用in
6. 应尽量避免在where子句中使用!=或<>
7. 应尽量避免在索引列上做任何操作,如函数,计算,类型转换等。如trim(),substring(),num = 100*2
js常用字符串处理方法
JS自带函数
1. string.concat(string1, string2, ..., stringX); 将两个或多个字符的文本组合起来,返回一个新的字符串。
2. string.charAt(index); 方法可返回指定位置的字符。第一个字符位置为 0, 第二个字符位置为 1,以此类推。
3. string.indexOf(searchvalue,start); 方法返回某个指定的字符串值在字符串中首次出现的位置。如果没有找到匹配的字符串则返回-1。indexOf()方法区分大小写。
4. string.match(regexp); 方法可在字符串内检索指定的值,或找到一个或多个正则表达式的匹配。比如:var n=str.match(/ain/gi); 返回值为:存放匹配结果的数组。如果没有找到匹配结果返回null.
5. string.substring(from, to); 方法用于提取字符串中介于两个指定下标之间的字符。返回的子串包括开始处的字符,不包括结束处的字符。
6. string.substr(start,length); 方法可在字符串中抽取从start下标开始的指定数目的字符。 substr() 方法不会改变源字符串。
7. string.replace(searchvalue,newvalue); 方法用于在字符串中用一些字符替换了另一些字符,或替换一个与正则表达式匹配的字符串。比如:var n=str.replace(/blue/g,"red");
8. string.search(searchvalue); 方法用于检索字符串中指定的子字符串,或检索与正则表达式相匹配的子字符串。如果没有找到任何匹配的子串,则返回-1。比如:str.search(/blue/i)。
9. string.slice(start,end); 方法可提取字符串的某个部分,并以新的字符串返回被提取的部分。使用start(包含)和end(不包含)参数来指定字符串提取的部分。start 参数字符串中第一个字符位置为 0, 第二个字符位置为 1, 以此类推,如果是负数表示从尾部截取多少个字符串,slice(-2) 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。end 参数如果为负数,-1 指字符串的最后一个字符的位置,-2 指倒数第二个字符,以此类推。
10. string.split(separator,limit); 方法用于把一个字符串分割成字符串数组。方法不改变原始字符串。
11. string.length; length 属性返回字符串的长度(字符数)。
12. string.toLowerCase(); 方法用于把字符串转换为小写。
13. string.toUpperCase(); 方法用于把字符串转换为大写。
14. string.trim(); 方法用于删除字符串的头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符等。不会改变原始字符串。不适用于 null, undefined, Number 类型。
15. string.includes(searchvalue, start); 方法用于判断字符串是否包含指定的子字符串。如果找到匹配的字符串则返回 true,否则返回 false。区分大小写。
网友评论