mySQL的面试问题

  • 索引的概念:就是用一个数据结构组织某一列的数据,当你要根据这一列查询数据的时候,不需要进行全表扫描,只需要按照这个数据结构找到那一列的值,再找到那一行的物理地址即可;
  • 索引的实现和数据结构:底层就是一个b+树
    需要理解b-树的概念
    不同的存储引擎对索引的实现是不一样的(myism/innodb)
  • 存储引擎
    a)myism:在myism存储引擎的索引中,每个叶子节点的data存储的是数据行的物理地址,比如0x07之类的东西;
    myism最大的特点是数据文件和索引文件是分开的,先在索引文件中搜索得到物理地址,再在数据文件中得到行数据
    b)innodb:数据文件就是索引文件,每个叶子节点的data就是数据的所在行,要求必须有索引,会根据主键创建一个默认的索引,叫做聚簇索引;
    联合索引:针对几个字段建立的联合索引(create index (shop_id,product_id,gmt_create))
  • 索引的使用规则
    a)全列匹配:查询SQL的where条件中包括了联合索引中的所有字段;
    b)最左前缀匹配:SQL里面用到了联合索引最左边的一个或者几个,也是可以用上索引的;
    c)最左前缀匹配了,但是中间某个值没匹配:联合索引中最左边的条件会走索引查找,其他的只会进行简单的数据过滤,不会走索引;
    d)没有最左前缀匹配:一定不行,没有走索引,索引mysql中一定要遵循最左侧前缀匹配原则;
    e)前缀匹配:不是使用=,>=,<=而是使用的模糊匹配,必须最左侧是精准的值(like XX%)才可以使用索引查找;
    f)范围列匹配:如果你是范围查询,比如>=,<=,between操作,你只能是符合最左前缀的规则才可以范围,范围之后的列就不用索引了
    select * from product where shop_id>=1 and product_id=1
    这里就在联合索引中根据shop_id来查询了
    h)包含函数:如果你对某个列用了函数,比如substring之类的东西,那么那一列不用索引,函数会导致索引失效的
  • 索引的注意事项
    过多的索引会占用磁盘文件的,高并发情况下频繁的修改索引会导致性能损耗的
    建议:索引不宜创建过多并且要针对唯一的值创建索引
  • 索引的类型
    主键索引(聚簇索引),联合索引,前缀索引
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值