当前位置: 首页 > news >正文

大连网站制作案例长沙公司排行

大连网站制作案例,长沙公司排行,云南楚雄特产,网站行业1. 索引失效案例 MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法#xff0c;并且加快查询的速度#xff0c;因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录#xff0c;从而提高数据库查询的速… 1. 索引失效案例 MySQL中提高性能的一个最有效的方式是对数据表设计合理的索引。索引提供了访问高效数据的方法并且加快查询的速度因此索引对查询的速度有着至关重要的影响。 使用索引可以快速地定位表中的某条记录从而提高数据库查询的速度提高数据库的性能。 如果查询时没有使用索引查询语句就会扫描表中的所有记录。在数据量大的情况下这样查询的速度会很慢。 大多数情况下都默认采用B树来构建索引。只是空间列类型的索引使用R-树并且MEMORY表还支持hash索引。 其实用不用索引最终都是优化器说了算。优化器是基于什么的优化器基于cost开销(CostBaseOptimizer)它不是基于规则(Rule-BasedOptimizer)也不是基于语义。怎么样开销小就怎么来。另外SQL语句是否使用索引跟数据库版本、数据量、数据选择度都有关系。 1.1 全值匹配我最爱 1.2 最佳左前缀法则 在MySQL建立联合索引时会遵守最佳左前缀匹配原则即最左优先在检索数据时从联合索引的最左边开始匹配。 结论MySQL可以为多个字段创建索引一个索引可以包括16个字段。对于多列索引**过滤条件要使用索引必须按照索引建立时的顺序依次满足一旦跳过某个字段索引后面的字段都无法被使用。**如果查询条件中没有使用这些字段中第1个字段时多列或联合索引不会被使用。 1.3 主键插入顺序 对于一个使用InnoDB存储引擎的表来说在我们没有显示的创建索引时表中的数据实际上都是存储在聚簇索引的叶子节点的。而记录又存储在数据页中的数据页和记录又是按照记录主键值从小到大的顺序进行排序所以如果我们插入的记录的主键值是依次增大的话那我们每插满一个数据页就换到下一个数据页继续插而如果我们插入的主键值忽小忽大的话则可能会造成页面分裂和记录移位。 1.4 计算、函数、类型转换(自动或手动)导致索引失效 1.5 类型转换导致索引失效 1.6 范围条件右边的列索引失效 应用开发中范围查询例如金额查询日期查询往往都是范围查询。应将查询条件放置where语句最后。创建的联合索引中务必把范围涉及到的字段写在最后 1.7 不等于(! 或者)索引失效 1.8 is null可以使用索引is not null无法使用索引 结论最好在设计数据表的时候就将字段设置为 NOT NULL 约束比如你可以将INT类型的字段默认值设置为0。将字符类型的默认值设置为空字符串(‘’) 拓展同理在查询中使用not like也无法使用索引导致全表扫描 1.9 like以通配符%开头索引失效 拓展Alibaba《Java开发手册》 【强制】页面搜索严禁左模糊或者全模糊如果需要请走搜索引擎来解决。 1.10 OR 前后存在非索引的列索引失效 在WHERE子句中如果在OR前的条件列进行了索引而在OR后的条件列没有进行索引那么索引会失效。也就是说OR前后的两个条件中的列都是索引时查询中才使用索引。 1.11 数据库和表的字符集统一使用utf8mb4 统一使用utf8mb4( 5.5.3版本以上支持)兼容性更好统一字符集可以避免由于字符集转换产生的乱码。不同的字符集进行比较前需要进行转换会造成索引失效。 2. 关联查询优化 结论1对于内连接来说查询优化器可以决定谁来作为驱动表谁作为被驱动表出现 结论2对于内连接来讲如果表的连接条件中只能有一个字段有索引则有索引的字段所在的表会被作为被驱动表 结论3对于内连接来说在两个表的连接条件都存在索引的情况下会选择小表作为驱动表。小表驱动大表 2.1 Index Nested-Loop Join索引嵌套循环连接 Index Nested-Loop Join其优化的思路主要是为了减少内层表数据的匹配次数所以要求被驱动表上必须有索引才行。 2.2 Block Nested-Loop Join块嵌套循环连接 如果存在索引那么会使用index的方式进行join如果join的列没有索引被驱动表要扫描的次数太多了。每次访问被驱动表其表中的记录都会被加载到内存中然后再从驱动表中取一条与其匹配匹配结束后清除内存然后再从驱动表中加载一条记录然后把被驱动表的记录再加载到内存匹配这样周而复始大大增加了IO的次数。为了减少被驱动表的IO次数就出现了Block Nested-Loop Join的方式。 不再是逐条获取驱动表的数据而是一块一块的获取引入了join buffer缓冲区将驱动表join相关的部分数据列大小受join buffer的限制缓存到join buffer中然后全表扫描被驱动表被驱动表的每一条记录一次性和join buffer中的所有驱动表记录进行匹配内存中操作将简单嵌套循环中的多次比较合并成一次降低了被驱动表的访问频率。 2.3 Hash Join 从MySQL的8.0.20版本开始将废弃BNLJ因为从MySQL8.0.18版本开始就加入了hash join默认都会使用hash join。 Nested Loop对于被连接的数据子集较小的情况下Nested Loop是个较好的选择。 Hash Join是做大数据集连接时的常用方式优化器使用两个表中较小相对较小的表利用Join Key在内存中建立散列值然后扫描较大的表并探测散列值找出与Hash表匹配的行。 这种方式适用于较小的表完全可以放入内存中的情况这样总成本就是访问两个表的成本之和。 在表很大的情况下并不能完全放入内存这时优化器会将它分割成若干不同的分区不能放入内存的部分就把该分区写入磁盘的临时段此时要求有较大的临时段从而尽量提高I/O的性能。 它能够很好的工作于没有索引的大表和并行查询的环境中并提供最好的性能。Hash Join只能应用于等值连接这是由Hash的特点决定的。 3. 子查询优化 子查询是 MySQL 的一项重要的功能可以帮助我们通过一个 SQL语句实现比较复杂的查询。但是子查询的执行效率不高。原因如下 ① 执行子查询时MySQL需要为内层查询语句的查询结果建立一个临时表然后外层查询语句从临时表中查询记录。查询完毕后再撤销这些临时表。这样会消耗过多的CPU和IO资源产生大量的慢查询。 ② 子查询的结果集存储的临时表不论是内存临时表还是磁盘临时表都不会存在索引所以查询性能会受到一定的影响。 ③ 对于返回结果集比较大的子查询其对查询性能的影响也就越大。 在MySQL中可以使用连接JOIN查询来替代子查询。**连接查询不需要建立临时表其速度比子查询要快如果查询中使用索引的话性能就会更好。 结论尽量不要使用NOT IN 或者 NOT EXISTS用LEFT JOIN xxx ON xx WHERE xx IS NULL替代 4. 排序优化 SQL 中可以在 WHERE 子句和 ORDER BY 子句中使用索引目的是在 WHERE 子句中 避免全表扫描在 ORDER BY 子句避免使用 FileSort 排序。当然某些情况下全表扫描或者 FileSort 排序不一定比索引慢。但总的来说我们还是要避免以提高查询效率。 尽量使用 Index 完成 ORDER BY 排序。如果 WHERE 和 ORDER BY 后面是相同的列就使用单索引列如果不同就使用联合索引。 无法使用 Index 时需要对 FileSort 方式进行调优。 5. GROUP BY优化 group by 使用索引的原则几乎跟order by一致 group by 即使没有过滤条件用到索引也可以直接使用索引。 group by 先排序再分组遵照索引建的最佳左前缀法则 当无法使用索引列可以增大max_length_for_sort_data和sort_buffer_size参数的设置 where效率高于having能写在where限定的条件就不要写在having中了 减少使用order by和业务沟通能不排序就不排序或将排序放到程序端去做。Order by、group by、distinct这些语句较为耗费CPU数据库的CPU资源是极其宝贵的。 包含了order by、group by、distinct这些查询的语句where条件过滤出来的结果集请保持在1000行以内否则SQL会很慢。 6. 优化分页查询 优化思路一 在索引上完成排序分页操作最后根据主键关联回原表查询所需要的其他列内容。 EXPLAIN SELECT * FROM student t,(SELECT id FROM student ORDER BY id LIMIT 2000000,10) a WHERE t.id  a.id; 优化思路二 该方案适用于主键自增的表可以把Limit 查询转换成某个位置的查询。 EXPLAIN SELECT * FROM student WHERE id  2000000 LIMIT 10;7. 优先考虑覆盖索引 7.1 什么是覆盖索引 理解方式一索引是高效找到行的一个方法但是一般数据库也能使用索引找到一个列的数据因此它不必读取整个行。毕竟索引叶子节点存储了它们索引的数据当能通过读取索引就可以得到想要的数据那就不需要读取行了。一个索引包含了满足查询结果的数据就叫做覆盖索引。 理解方式二非聚簇复合索引的一种形式它包括在查询里的SELECT、JOIN和WHERE子句用到的所有列即建索引的字段正好是覆盖查询条件中所涉及的字段。 简单说就是索引列主键包含SELECT 到 FROM之间查询的列。 7.2 覆盖索引的利弊 好处 1. 避免Innodb表进行索引的二次查询回表 2. 可以把随机IO变成顺序IO加快查询效率 弊端 索引字段的维护总是有代价的。因此在建立冗余索引来支持覆盖索引时就需要权衡考虑了。这是业务DBA或者称为业务数据架构师的工作。 8. 索引条件下推 8.1 使用前后的扫描过程 在不使用ICP索引扫描的过程 storage层只将满足index key条件的索引记录对应的整行记录取出返回给server层 server 层对返回的数据使用后面的where条件过滤直至返回最后一行。 使用ICP扫描的过程 storage层首先将index key条件满足的索引记录区间确定然后在索引上使用index filter进行过滤。将满足的index filter条件的索引记录才去回表取出整行记录返回server层。不满足index filter条件的索引记录丢弃不回表、也不会返回server层。 server 层对返回的数据使用table filter条件做最后的过滤。 9. 其它查询优化策略 9.1 EXISTS 和 IN 的区分 索引是个前提其实选择与否还会要看表的大小。你可以将选择的标准理解为小表驱动大表。 9.2 COUNT(*)与COUNT(具体字段)效率 环节1COUNT(*)和COUNT(1)都是对所有结果进行COUNTCOUNT(*)和COUNT(1)本质上并没有区别二者执行时间可能略有差别不过你还是可以把它俩的执行效率看成是相等的。如果有WHERE子句则是对所有符合筛选条件的数据行进行统计如果没有WHERE子句则是对数据表的数据行数进行统计。 环节2如果是MyISAM存储引擎统计数据表的行数只需要O(1)的复杂度这是因为每张MyISAM的数据表都有一个meta信息存储了row_count值而一致性则是由表级锁来保证的。 如果是InnoDB存储引擎因为InnoDB支持事务采用行级锁和MVCC机制所以无法像MyISAM一样维护一个row_count变量因此需要采用扫描全表是O(n)的复杂度进行循环计数的方式来完成统计。 环节3在InnoDB引擎中如果采用COUNT(具体字段)来统计数据行数要尽量采用二级索引。因为主键采用的索引是聚簇索引聚簇索引包含的信息多明显会大于二级索引非聚簇索引。对于COUNT(*)和COUNT(1)来说它们不需要查找具体的行只是统计行数系统会自动采用占用空间更小的二级索引来进行统计。 如果有多个二级索引会使用key_len小的二级索引进行扫描。当没有二级索引的时候才会采用主键索引来进行统计。 9.3 关于SELECT(*) 在表查询中建议明确字段不要使用 * 作为查询的字段列表推荐使用SELECT 字段列表 查询。原因 ① MySQL 在解析的过程中会通过查询数据字典将*按序转换成所有列名这会大大的耗费资源和时间。 ② 无法使用覆盖索引 9.4 LIMIT 1 对优化的影响 针对的是会扫描全表的 SQL 语句如果你可以确定结果集只有一条那么加上LIMIT 1的时候当找到一条结果的时候就不会继续扫描了这样会加快查询速度。 如果数据表已经对字段建立了唯一索引那么可以通过索引进行查询不会全表扫描的话就不需要加上LIMIT 1了。 9.5 多使用COMMIT 只要有可能在程序中尽量多使用 COMMIT这样程序的性能得到提高需求也会因为 COMMIT 所释放的资源而减少。 COMMIT 所释放的资源 回滚段上用于恢复数据的信息 被程序语句获得的锁 redo / undo log buffer 中的空间 管理上述 3 种资源中的内部花费
http://wiki.neutronadmin.com/news/281048/

相关文章:

  • 网站建设观点新能源汽车价格排名
  • 网站导航颜色哈尔滨h5模板建站
  • dw可以制作网站吗静态网页设计教程
  • 做游戏奖金不被发现网站亚洲风影视传媒有限公司辽宁
  • 花都电子商务网站建设做 爱 网站视频教程
  • 官方网站套餐网站关键词搜索排名
  • 做网站公司有什么出路dedecms医院网站
  • 中展建设股份有限公司网站微信网站制作价格
  • 建设一个班级网站的具体步骤深圳代理网络推广公司
  • 网站内链代码域名注册需要哪些条件
  • 网站设计公司 推荐昆明网站建设方案外包
  • 电子商务网站建设读书报告怎么申请小程序
  • 加若格网站做么样烟台企业网站开发
  • 宜宾县企业项目建设影响环境登记表网站开发者应用
  • 广州网站开发水平广州亦客网络如何自建网站做淘客
  • 微信公众号怎么推广百度seo详解
  • 青岛定制网站设计公司叫任何一个人一个小时做网站
  • 免费发布信息网站网址大全网络系统管理员
  • 娄底建设网站在线网站备份
  • 网站适合用angular做吗做门窗安装用哪些网站找生意
  • 怎么在国外的搜索网站做推广优良的网站邮箱服务器提供商isp
  • 做任务有q币的网站网站开发运营费用
  • 动漫网站设计源代码抖音小程序搭建
  • 制作网站需要什么成本python做网站原理
  • 嘉兴网站排名优化费用wordpress 修改个人资料
  • 农村电商网站建设方案徐州哪里做网站好
  • 网站规划与建设进度网站上内容列表怎么做的
  • 云一网站建设微信免费开发平台
  • 网站内容页模板做网站的公司哪家好
  • 龙湖建设工程有限公司网站牛人网络网站