配色: 字号:
数据库必知知识点:索引下推、数据库优化
2020-11-13 | 阅:  转:  |  分享 
  
1、索引下推(阿里社招)MySQL5.6引了索引下推优化。默认开启,使SEToptimizer_switch=‘index_
condition_pushdown=offff’;可以将其关闭。有了索引下推优化,可以在减少回表次数;在InnoDB中只针对级
索引有效;譬如,在people_table中有个级索引(zipcode,lastname,fifirstname),查询是
SELECTFROMpeopleWHEREzipcode=’95054′ANDlastnameLIKE‘%et
runia%’ANDaddressLIKE‘%MainStreet%’;如果没有使索引下推技术,则MySQL会通过zi
pcode=’95054’从存储引擎中查询对应的数据,返回到MySQL服务端,然后MySQL服务端基于lastnameLI
KE‘%etrunia%’andaddressLIKE‘%MainStreet%’来判断数据是否符合条件。如果使了索
引下推技术,则MYSQL先会返回符合zipcode=’95054’的索引,然后根据lastnameLIKE‘%etrun
ia%’andaddressLIKE‘%MainStreet%’来判断索引是否符合条件。如果符合条件,则根据该索引来定
位对应的数据,如果不符合,则直接reject掉。2、查询在什么情况下不?索引?先,我们可以说通过explain去排查?个慢查询,
进?找到它的索引(参看第五题),当创建索引却不?索引时,我们就需要考虑到优化器的问题。在?条单表查询语句真正执?之前,MySQL
的查询优化器会找出执?该语句所有可能使?的?案,对就是所谓的执?计划。优化过程?致如下:1.根据搜索条件,找出所有可能使?的索引
2.计算全表扫描的代价3.计算使?不同索引执?查询的代价4.对?各种执??案的代价,找出成本最低的那?个那么,有哪?种情况明
明设了索引却不?索引呢?假设索引为(a,b,c)ASC和DESC索引混合使?的排序:selectfromta
borderbya,bdesclimit10;违背最左前缀原则:selectfromtabwhere
b=''1'';WHERE?句中出现?排序使?到的索引列:selectfromtabd=''1''orderb
yalimit10;排序列包含?同?个索引的列:selectfromtaborderbya,dlimi
t10;WHERE?句中出现计算:selectfromtabwherea4=2;WHERE?句中出
现null值:selectfromtabwherea=null;WHERE?句中使?!=或<>操
作符:selectfromtabwherea!=1;3、MySQL如何为表字段添加索引下?是添加索引的SQ
L语法1.添加主键索引1ALTERTABLE`table_name`ADDPRIMARYKEY(`column
`)2.添加唯?索引1ALTERTABLE`table_name`ADDUNIQUE(`column`)3
.添加普通索引1ALTERTABLE`table_name`ADDINDEXindex_name(`column
`)4.添加全?索引(适?于MyISAM,InnoDB5.6+)1ALTERTABLE`table_name`AD
DFULLTEXT(`column`)5.添加联合索引1ALTERTABLE`table_name`ADDIN
DEXindex_name(`column1`,`column2`,`column3`)4、如何选择索引1.只为?于
搜索、排序或分组的列创建索引2.考虑列的基数,基数越?,创建索引的效果越好3.索引列的类型尽量?,这样B+树中每个?存储的
数据就会更多4.写多读少尽量不要建?索引5.可以使?倒叙索引或者hash索引6.InnoDB的主键尽量?MySQL的?增主
键5、唯?索引和普通索引选择哪个?唯?索引和普通索引在读取的时候效率基本差不多,普通索引差了?点点。主要是判断和特殊情况下的
?次IO写?的时候,普通索引可以利?changebuffffer适合写多读少,?唯?索引要快。以业务为前提,如果要求唯?,就要
选择唯?索引。如果已经保证列的唯?,我们尽量选择普通索引,然后把changebuffffer调?。6、MySQL的优化1.
MySQL的查询优化?上?中的如何选择索引?使?连接代替?查询?尽量?IN代替OR,OR的效率是n级别,IN
的效率是log(n)级别,IN的个数建议控制在200以内;能?BETWEEN不?IN;?尽量?LIMIT,同时尽量
不?count?切分?个连接时间很?的查询,或返回数据量很?的查询;?分解关联查询,在应?层做关联,可以更容易对数据库进?
拆分,减少锁的竞争,减少冗余记录的查询;7、MySQL?数据量下的优化(腾讯春招)这个题可说的点实在太多了,?试官很有可能跟
据下?说的优化进?来问问题。建表时?此处考察如何建?索引?字段类型尽量精确,尽量?,能?int不要?bigint?尽量不
要?null,声明notnull,如果是null?0代替尽量使?TIMESTAMP??DATETIME??整型
来存ip?注意反范式和范式的优化查询时?参考查询优化?参考前?的查询在什么情况下不?索引加缓存NoSQL?Memcac
hed?Redis分区MySQL内置的是?平分区,分为range,list,hash,key?在分区的基础上还可以有?分区,
?个分区创建?分区,其他分区也要创建?分区;每个分区的?分区数必须相同;所有分区必须使?相同的存储引擎?分区表的数据还可以分布在不同的物理设备上分表&分表?垂直分表:把表中的?些字段移到其他表或者新建表??平分表:和分区类似?垂直分库:把不同数据表分到不同库,不同服务器上?可以使?MyCat等中间件来实现?换Hadoop家族
献花(0)
+1
(本文系进击的科科首藏)