问题一:
某电商服务端使用mysql作为数据存储,发现在业务高峰期时,后台报表页面无法从mysql中查询出数据。请写出排查问题的流程和解决方案
可能原因:
出现这种问题很可能是某些业务字段有空值导致索引失效从而进行了全表扫描造成的,所以可以考虑以下的方案:
1) 定位到影响查询效率的字段
2) 将Null值用常量替换,比如数值型的用0替换,字符串型的用某个固定的字符替换
3) 优化sql语句,除了满足优化原则外(可以详细说说哪些原则),把最影响查询效率的字段放在where语句的最后面
4) 优化数据库结构
问题二:
批量导入mysql如何实现效率最高?
解决方案:
1.最快的当然是直接 copy 数据库表的数据文件(版本和平台最好要相同或相似);
2.设置 innodb_flush_log_at_trx_commit = 0 ,相对于 innodb_flush_log_at_trx_commit = 1 可 以十分明显的提升导入速度;
3.使用 load data local infile “文件” into table 表名; 提速明显;
4.修改参数 bulk_insert_buffer_size, 调大批量插入的缓存;
5.合并多条 insert 为一条: insert into t values(a,b,c), (d,e,f) ,
6.手动使用事务;
问题三:
MySQL 怎样建立二级索引? 建立二级索引的原则是什么
二级索引又称辅助索引、非聚集索引(no-clustered index)。b+tree树结构。然而二级索引的叶子节点不保存记录中的所有列,其叶子节点保存的是<健值,(记录)地址>。好似聚集索引中非叶子节点保存的信息,不同的是二级索引保存的是记录地址,而聚集索引保存的是下一层节点地址。记录的地址一般可以保存两种形式。
- 1.记录的物理地址,页号:槽号:偏移量
- 2.记录的主键值
二级索引的非叶子节点存放的记录格式为<键值,主键值,地址>,二级索引的非叶子节点依然存在主键信息。二级索引节点的记录不保存隐藏列xid和roll ptr。聚集索引的非叶子节点保存的是下一层节点地址。
由于二级索引不包含记录的完整信息,在innodb存储引擎中二级索引的树高度比聚簇索引的树高度小,二级索引效率低。