MySQL 查询优化(一)


Mysql 慢查询该如何优化? 1.检查是否走索引,如果没用则优化SQL利用索引 2.检查所利用索引,是否为最优索引 3.检查所查询字段是否都是必须的,是否查询了过多的字段,查出了多余数据 4.检查数据是否过多,是否应该进行分库分表了 5.检查数据库实例所在机器的性能配置,是否太低,是否可以适当增加资源 6.结合实际,看服务与数据库间的网络环境,是否不属于不同的网络环境,是否需要通过VPN等手段,如果是需要优化网络 7.结合实际,查看分配的Mysql实例是否为共享实例,是否有其他项目再使用同一实例,造成连接数不够或者Mysql数据库压力过大   消息队列有哪些作用? 1.解耦:使用消息队列来作为两个系统直接的通讯方式,两个系统就不需要直接相互依赖了 2.异步:系统A给消息队列发送完消息之后,就可以继续处理其他事情,无需等待执行结果,适用于耗时或者耗资源的操作 3.流量消峰:如果使用消息队列的方式来调用某个系统,那么消息将在队列中排队,由消费之自己控制消费速度   索引是什么? 索引是帮助MySQL高效获取数据的排好序的数据结构 索引值为key,磁盘地址为value的K-V结构   索引的数据结构 1.二叉树 2.红黑树 优化版本的二叉树,就是对树的结构进行自行调节,降低树的高度,即查询次数 3.Hash表 4.B-Tree   Mysql B+Tree 特点: 1.非叶子节点不存储data,只存储索引(冗余),可以更多的索引 2.叶子节点包含所有的索引字段 3.叶子节点用指针连接,提高区间访问的性能 双向链表 MySQL每个节点是一页数据,允许的大小是16KB show GLOBAL status like 'Innodb_page_size';   数据库所谓的存储引擎都是表级别生效的。   MySQL表文件: 1.frm文件 表结构信息 2.MYD文件 MYISAM引擎的表数据文件 3.MYI文件 MYISAM引擎的索引文件 MYISAM 查询走索引时,先从索引文件(MYI)中定位到索引值读取到索引值对应的磁盘地址,再根据磁盘地址取读数据文件(MYD)中对应的数据。   Innodb 表文件: 1.frm文件 表结构文件 2.ibd文件 表索引以及数据文件   InnoDB引擎索引的实现(聚集) 1.表数据文件本身就是B+Tree组织的一个索引结构文件 2.聚集索引-叶节点包含了完整的数据记录(聚簇索引) 延申:什么是非聚集索引? 索引文件和数据文件是分离的,不在同一个文件中这种可以理解为非聚集索引 3.为什么建议InnoDB表必须建主键,并且推荐使用整型自增主键? 如果不创建主键列,MySQL需要自行维护一列,来确保可以创建B+Tree. 最好用数字类型,因为在构建B+Tree和查询数据时,有大量的需要主键去比大小的过程,数字类型比字符串大小比较时会更快,并且整形更省空间。 为什么自增?插入数据时,减少索引值比较,和减少索引页的分裂。 4.为什么非主键索引结构叶子节点存储的是主键值?(一致性和节省存储空间,   InnoDB中只有主键索引是聚集索引,其他的二级索引不是。 InnoDB中只有通过主键索引查找数据的时候,可以直接读取数据。 通过其他索引查询时,查找到的时该表的主键,然后再通过主键的聚集索引读取到数据。这个过程依然属于回表。   Hash 数组+链表 1.对索引的key进行一次hash计算就可以定位出数据存储的位置 2.很多时候Hash索引要比B+树索引更高效 3.仅能满足“=”,“IN” 不支持范围查询 4.hash冲突问题   查询数据文件及索引文件大小: SELECT DATA_LENGTH / (1024 * 1024 ) AS 'DATA_SIZE(MB)', INDEX_LENGTH / (1024 * 1024 ) AS 'INDEX_SIZE(MB)', TABLE_SCHEMA, TABLE_NAME FROM information_schema.TABLES WHERE TABLE_NAME = 'tianqing_routing';