• MySQL一些优化[转]


    1.uuid用binary保存
    建议uuid不要使用char来保存,而用binary(16)来保存。这里在长度上来讲用binary会节省一半。因为一个字符占用1个字节,而一个字节实际上可以表示0-256(2^8),用16进制的表示需要2个字节00-FF(0-256)。
    优化前:SET uuid = UUID() (类型:char(36))
    优化后:SET uuid = HEX(REPLACE(UUID(), '-', '')) (类型:binary(16))

    2.用crc32替换长字符串的查找
    如果索引列是个很长的字符串,例如url。那可以再建立一个列用来保存这个列的crc32结果,以提高索引的使用速度。
    优化前:WHERE url = 'http://willko.iteye.com/' (索引:url,类型:var/char(?))
    优化后:WHERE url_crc32 = CRC32('http://willko.iteye.com/') AND url = 'http://willko.iteye.com/' (索引:url_crc32,类型:unsigned int)

    3.前缀索引和后缀索引
    前缀索引听得比较多,优点是减少索引的长度,缺点是排序不能使用前缀索引(影响distinct/order/group),也不会出现Covering Index(只读取索引就能满足查询)。
    后缀索引还是首次听到,孤陋寡闻了。因为MySQL不支持反向索引,所有有时候查询会有问题,例如字段blog保存用户的博客地址 (http://willko.iteye.com),那需要查询某个域名有多少个用户就不好查询,可以用一个额外的字段反转保存。 blog_reverse:moc.eyeavaj.willko://ptth,这样就很容易查到iteye.com(moc.eyeavaj)有多少 用户了,并可以使用索引,也就是解决了 LIKE '%?'的问题,因为查询反转成LIKE '?%'了。

    4.散列数据
    散列数据就是把原本只有一条记录的散列成多条,充分利用InnoDB行锁的特性,提高并发。
    例如,之前是UPDATE hit_counter SET cnt = cnt + 1 WHERE id = ?
    散列后是 UPDATE hit_counter SET cnt = cnt + 1 WHERE id = ? AND slot = rand() * 100
    散列后查询需要合并数据。

    5.优化limit和offset
    MySQL的limit工作原理就是先读取n条记录,然后抛弃前n条,读m条想要的,所以n越大,性能会越差。
    优化前SQL: SELECT * FROM member ORDER BY last_active LIMIT 50,5
    优化后SQL: SELECT * FROM member INNER JOIN (SELECT member_id FROM member ORDER BY last_active LIMIT 50, 5) USING (member_id)
    分别在于,优化前的SQL需要更多I/O浪费,因为先读索引,再读数据,然后抛弃无需的行。而优化后的SQL(子查询那条)只读索引(Cover index)就可以了,然后通过member_id读取需要的列。

    原文:http://willko.iteye.com/blog/670120

  • 相关阅读:
    只要我跑的够快,内卷它就卷不到我,一名高中生是如何做到在疫情下涨薪70%的?
    一个@Transaction哪里来这么多坑?
    基于netty实现一个完整的TFTP服务器
    DBeaver安装和注意要点
    Logstash将ES服务器A数据迁移ES服务器B
    Logstash迁移ES5.6.1一个索引多type类型迁移到ES7.6.2无type类型
    windows下使用filezilla上传文件权限问题
    logstash7.6.2更新已存在的elasticsearch记录
    mysql磁盘空间不足报错
    Kibana中DevTools命令集锦
  • 原文地址:https://www.cnblogs.com/yiki/p/2923801.html
Copyright © 2020-2023  润新知