(十五)MySql常见问题解答

  • 一张表建多了索引会有什么问题?
    答:增,删,改效率会降低,并且带来大量空间的占用
    解说:
    a.我们知道每个索引都是一颗B+树,意味着每建一个索引,我们就要存储一颗B+树,B+树由n多个页组成,一个页固定大小为16kb,那么存储一颗B+树的空间为n*16kb,具体多少,由你的记录条数决定。
    b.B+树的内部结构就是将作为索引的列值进行从小到大排列,那么如果如果增加一条记录,那么意味着涉及到的字段有索引的都要把相关字段加到各自的B+树当中,如果遇到页分裂情况,那么效率就更低了。
  • 使用索引需要注意哪些问题?
    a.联合索引使用方式: 使用的时候,必须是从左到右连续的。比如考试成绩排名按照语文数学英语的分数进行排名,小红分别考虑 98 90 70 小强分别是 98 85 85,那么按照我们的规律,我们认为小红排名靠前,因为小红语文和小强一样,但是数学分数比小强高。如果按照规则直接拿出 语文英语出来比,小红为 98 70 小强 98 85,看起来小强应该靠前,但是按照我们规则必须先看数学谁分高才排前的,所以这种情况无法判断谁排名靠前,也就是跳过的话,那么后面的索引是使用不上的。
    b. 联合索引范围查找: 1.使用联合索引进行范围查找的时候,如果使用联合索引第一个字段进行了范围查找可以用到索引,如果后面继续使用联合索引的第二个字段进行范围查询,那么是用不了索引的;2.使用联合索引进行范围查找的时候,如果使用联合索引第一个字段进行了精确查找,自然可以用到索引,如果后面继续使用联合索引的第二个字段进行范围查询,那么依然可以用到索引;例子如下:
       语文   数学      英语
       98      95      90
       98      94      85
       98      93      80
       97      99      85
       1. where  语文>97 and 语文<99  and 数学(用不上索引,这列在B+树不一定有序)>95
       2. where   语文=98  数学(用得上索引,这列在B+树有序)>95
    
    c.匹配列前缀:就是说我们要尽量让我们关心的值放在列的前面。比如我们要检索域名,我们感兴趣的树域名结尾的信息,如果我们直接存的aaa.com ,bb.cn. 那我想查以.com结尾的,那么我们只能写like %.com,这样只会全表扫描,使用不上索引的。我们可以将关心的存储在列前比如存储为com.aaa,那么我们直接写 like com.%,那么是可以使用索引的。
    d.建立了索引的列用了复杂表达式,那么索引会失效
    1.使用了一些函数 upper(s),将字符串进行了大写,那么很明显B+树只是按小写排序了,所以用不了索引
    2.字符串强转为了数字,索引也会失效,比如字符串 ‘0’ 和数字 0他们编码是不同的,自然就会排序不同
    3.字符编码的隐形转换,因为不同字符集编码不同,那么在比较上自然也不同,因为这个索引只是对一种编码的排序,自然不适用其他的编码,所以最好数据库的表统一字符编码,否则会出现隐士转换
    
    e.有时候需要提高性能,可以使用覆盖索引的方式,可以减少回表的性能消耗
发布了65 篇原创文章 · 获赞 11 · 访问量 7130

猜你喜欢

转载自blog.csdn.net/weixin_38312719/article/details/104436562