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家族 |
|