• 高并发数据库之MySql性能优化实战总结


    向MySQL发送一个请求时MySQL具体的操作过程

    慢查询

    1.慢查询

    SHOW  VARIABLES LIKE '%quer%'
    

    索引优化技巧

    1.对于创建的多列索引(复合)索引,只要查询条件使用了最左边的列,索引一般就会被使用。

    2.对于使用like的查询,查询如果是“%aaa”、“_aaa”就不会使用索引,“aaa%”就会使用索引。

    3.如果条件中有or,则要求or的所有字段都必须有索引,否则不能使用索引。

    4.如果列类型是字符串,则一定要在条件中将数据使用引号引起来,否则不使用索引。

    5如果全表扫描比索引快,则不使用索引。

    6.优化group by语句

        默认情况下mysql对所有的group by进行排序

    EXPLAIN  SELECT * FROM USER WHERE username='jxzz' GROUP BY creattime

        如果查询中包含group by,但用户想避免排序结果的消耗,则可以使用ORDER BY NULL禁止排序

    EXPLAIN  SELECT * FROM USER WHERE username='jxzz' GROUP BY creattime ORDER BY NULL

     

    7.尽量用连接查询代替子查询。因为子查询会在内存中创建临时表。而join是不需要在内存中创建临时表。

    8.用 exists 代替 in

        很多时候用 exists 代替 in 是一个好的选择:

        select num from a where num in(select num from b)

        用下面的语句替换:

        select num from a where exists(select 1 from b where num=a.num)

    9.使用 varchar/nvarchar 代替 char/nchar

        尽可能的使用 varchar/nvarchar 代替 char/nchar ,因为首先变长字段存储空间小,可以节省存储空间,其次对于查询来说,在一个相对较小的字段内搜索效率显然要高些。

    10.能用DISTINCT的就不用GROUP BY

        SELECT OrderID FROM Details WHERE UnitPrice > 10 GROUP BY OrderID

        可改为:

        SELECT DISTINCT OrderID FROM Details WHERE UnitPrice > 10

    11.能用UNION ALL就不要用UNION

        UNION ALL不执行SELECT DISTINCT函数,这样就会减少很多不必要的资源。

        Union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;

        Union All:对两个结果集进行并集操作,包括重复行,不进行排序;

     查询索引的使用情况

    命令

    SHOW STATUS LIKE 'handler_read%'

    UNIQUE 约束

    1.添加UNIQUE 约束

    ALTER TABLE Persons ADD UNIQUE (Id_P)
    ALTER TABLE Persons ADD CONSTRAINT uc_PersonID UNIQUE (Id_P,LastName)

    2.撤销 UNIQUE 约束

    ALTER TABLE Persons DROP INDEX uc_PersonID

    mysql 高并发查询更新之乐观锁和悲观锁

    先说乐观锁和悲观锁的机制:
    1. 乐观锁是一种思想,具体实现是,表中有一个版本字段,第一次读的时候,获取到这个字段。处理完业务逻辑开始更新的时候,需要再次查看该字段的值是否和第一次的一样。如果一样更新,反之拒绝。之所以叫乐观,因为这个模式没有从数据库加锁。

    2. 悲观锁是读取的时候为后面的更新加锁,之后再来的读操作都会等待。这种是数据库锁。

    乐观锁优点程序实现,不会存在死锁等问题。他的适用场景也相对乐观。阻止不了除了程序之外的数据库操作。

    悲观锁是数据库实现,他阻止一切数据库操作。

    再来说更新数据丢失,所有的读锁都是为了保持数据一致性。乐观锁如果有人在你之前更新了,你的更新应当是被拒绝的,可以让用户从新操作。悲观锁则会等待前一个更新完成。这也是区别。

    1.使用悲观锁:

    select * from LostUpdate where id =1 for update
    update LostUpdate set count=? where id =1

    2.使用乐观锁:

    update LostUpdate set count=?, version=version+1 where id =1 and version=?
  • 相关阅读:
    C# WinForm在高分辨率下界面模糊问题的解决
    C# 上传文件 造成内存溢出 解决方法
    C# Linq 交集、并集、差集、去重
    Linux 命令详解./configure、make、make install 命令
    需求分析的方法(二)
    需求分析的方法(一)
    WinDbG工具实践
    windows server 2008 IIS FTP服务器配置采坑
    网站CPU占满,微信经常SSL不能建立的错误排查
    ABP 数据迁移初始化的坑
  • 原文地址:https://www.cnblogs.com/cnki/p/6286865.html
Copyright © 2020-2023  润新知