zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    安全模式下卸载windows installer打包的软件(转)
    OAF页面集成条形码或者二维码
    记一次客户生产环境供应商门户服务器无法访问
    QML显示圆形图片
    QML加载gif
    QML之信号与槽
    QML访问C++类内部
    QML使用C++对象
    C++条件变量
    C/C++程序所占用内存区域
  • 原文地址:https://www.cnblogs.com/yiki/p/2923801.html
Copyright © 2011-2022 走看看