文章851
标签121
分类10

Mysql : SQL_CALC_FOUND_ROWS 和count(*) 性能比较

1.创建表:

此处使用了覆盖索引

CREATE TABLE IF NOT EXISTS `Ben` (
`aa` int(10) unsigned NOT NULL AUTO_INCREMENT,
`bb` int(10) unsigned NOT NULL,
`cc` varchar(100) NOT NULL,
PRIMARY KEY (`aa`),
KEY `bar` (`bb`,`aa`)
) ENGINE=MyISAM;

无覆盖索引

DROP TABLE IF EXISTS `ben`;
CREATE TABLE IF NOT EXISTS `ben` (
`aa` int(10) unsigned NOT NULL AUTO_INCREMENT,
`bb` int(10) unsigned NOT NULL,
`cc` varchar(100) NOT NULL,
PRIMARY KEY (`aa`),
KEY `bar` (`bb`)
) ENGINE=MyISAM;

2.插入100万条数据:

//插入数据
function insertData(){
    //数据表中插入100万条数据
    $ben = new Model();
    for($i = 0; $i < 1000000 ; $i++){
        $a = $i % 2 == 0 ? 1 : 0;
        $sql="insert into ben values (null,".$a.",'".md5($i)."')";
        $aa = $ben->query($sql);
    }
}

3.读取数据,测试程序执行时间:

function read01(){
    $start = microtime(true);
    $ben = new Model();
    $ben->query("select count(*) from ben where bb=1");
    $ben->query("select aa from ben where bb=1 limit 100,10");
    $end = microtime(true);
    echo $end - $start; //覆盖索引:0.018204927444458,无覆盖索引:0.017701148986816
}
function read02(){
    $start = microtime(true);
    $ben = new Model();
    $ben->query("select SQL_CALC_FOUND_ROWS aa from ben where bb=1 limit 100,10");
    $ben->query("select FOUND_ROWS()");
    $end = microtime(true);
    echo $end - $start; //覆盖索引:0.017460823059082,无覆盖索引:0.20762395858765
}

4.结论:

使用覆盖索引情况下,使用SQL_CALC_FOUND_ROWS性能较高;无覆盖索引情况下,使用count(*)性能较高。另使用innoDB引擎比MyISAM低。

附:

资料一:覆盖索引

select aa from ben where bb = 1;

1)统计总数:

select count(*) from ben where bb=1;

当我们在bb建立索引后,这个查询使用的就是覆盖索引(Covering Index)。

2)在分页操作中:

select id,title,content from ben order by createtTime desc limit 10000,10;

通常这样的查询会把索引建在createdTime字段(其中id是主键),不过当limit偏移很大时,查询效率仍然很低,采用覆盖索引来提升性能:
CREATE INDEX indexName ON ben ('createTime','id'),可以使用explain 查看是否是覆盖索引,出现extra:using index 就是

资料二:引擎MyISAMInnoDB区别

  InnoDB和MyISAM是许多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,视具体应用而定。基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持。

MyISAM类型的表强调的是性能,其执行速度比InnoDB类型更快,但是不提供事务支持,而InnoDB提供事务支持已经外部键等高级数据库功能。

  以下是一些细节和具体实现的差别:

  

◆1.InnoDB不支持FULLTEXT类型的索引。
  

◆2.InnoDB 中不保存表的具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count()语句包含 where条件时,两种表的操作是一样的。
  

◆3.对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中,可以和其他字段一起建立联合索引。
  

◆4.DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除。
  

◆5.LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用。另外,InnoDB表的行锁也不是绝对的,假如在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,例如update table set num=1 where name like “%aaa%”
  两种类型最主要的差别就是Innodb 支持事务处理与外键和行级锁.而MyISAM不支持.所以MyISAM往往就容易被人认为只适合在小项目中使用。

  我作为使用MySQL的用户角度出发,Innodb和MyISAM都是比较喜欢的,但是从我目前运维的数据库平台要达到需求:99.9%的稳定性,方便的扩展性和高可用性来说的话,MyISAM绝对是我

的首选。

原因如下:

  

1、首先我目前平台上承载的大部分项目是读多写少的项目,而MyISAM的读性能是比Innodb强不少的。
  
2、MyISAM的索引和数据是分开的,并且索引是有压缩的,内存使用率就对应提高了不少。能加载更多索引,而Innodb是索引和数据是紧密捆绑的,没有使用压缩从而会造成InnodbMyISAM体积庞大不小。
3、从平台角度来说,经常隔1,2个月就会发生应用开发人员不小心update一个表where写的范围不对,导致这个表没法正常用了,这个时候MyISAM的优越性就体现出来了,随便从当天拷贝的压缩包取出对应表的文件,随便放到一个数据库目录下,然后dumpsql再导回到主库,并把对应的binlog补上。如果是Innodb,恐怕不可能有这么快速度,别和我说让Innodb定期用导出xxx.sql机制备份,因为我平台上最小的一个数据库实例的数据量基本都是几十G大小。
  
4、从我接触的应用逻辑来说,select count(*)order by 是最频繁的,大概能占了整个sql总语句的60%以上的操作,而这种操作Innodb其实也是会锁表的,很多人以为Innodb是行级锁,那个只是where对它主键是有效,非主键的都会锁全表的。
  

5、还有就是经常有很多应用部门需要我给他们定期某些表的数据,MyISAM的话很方便,只要发给他们对应那表的frm.MYD,MYI的文件,让他们自己在对应版本的数据库启动就行,而Innodb就需要导出xxx.sql了,因为光给别人文件,受字典数据文件的影响,对方是无法使用的。

6、如果和MyISAMinsert写操作的话,Innodb还达不到MyISAM的写性能,如果是针对基于索引的update操作,虽然MyISAM可能会逊色Innodb,但是那么高并发的写,从库能否追的上也是一个问题,还不如通过多实例分库分表架构来解决。

7、如果是用MyISAM的话,merge引擎可以大大加快应用部门的开发速度,他们只要对这个merge表做一些select count(*)操作,非常适合大项目总量约几亿的rows某一类型(如日志,调查统计)的业务表。
  当然Innodb也不是绝对不用,用事务的项目如模拟炒股项目,我就是用Innodb的,活跃用户20多万时候,也是很轻松应付了,因此我个人也是很喜欢Innodb的,只是如果从数据库平台应用出发,我还是会首选MyISAM。

  另外,可能有人会说你MyISAM无法抗太多写操作,但是我可以通过架构来弥补,说个我现有用的数据库平台容量:主从数据总量在几百T以上,每天十多亿 pv的动态页面,还有几个大项

目是通过数据接口方式调用未算进pv总数,(其中包括一个大项目因为初期memcached没部署,导致单台数据库每天处理 9千万的查询)。而我的整体数据库服务器平均负载都在0.5-1左右。

原文 :https://blog.csdn.net/cuew1987/article/details/17393319

Linux命令 — lsof 查看进程打开那些文件 或者 查看文件给那个进程使用

lsof命令是什么?

可以列出被进程所打开的文件的信息。被打开的文件可以是

  1. 普通的文件,
  2. 目录
  3. 网络文件系统的文件,
  4. 字符设备文件
  5. (函数)共享库
  6. 管道,命名管道
  7. 符号链接
  8. 底层的[socket][1]字流,网络socket,unix域名socket
  9. 在linux里面,大部分的东西都是被当做文件的…..还有其他很多

怎样使用lsof

这里主要用案例的形式来介绍lsof 命令的使用

1. 列出所有打开的文件:

lsof

备注: 如果不加任何参数,就会打开所有被打开的文件,建议加上一下参数来具体定位

2. 查看谁正在使用某个文件

lsof /filepath/file

3. 递归查看某个目录的文件信息

lsof +D /filepath/filepath2/

备注: 使用了+D,对应目录下的所有子目录和文件都会被列出

4. 比使用+D选项,遍历查看某个目录的所有文件信息 的方法

lsof | grep ‘/filepath/filepath2/’

5. 列出某个用户打开的文件信息

lsof -u username

备注: -u 选项,u其实是user的缩写

6. 列出某个程序所打开的文件信息

lsof -c mysql

备注: -c 选项将会列出所有以mysql开头的程序的文件,其实你也可以写成 lsof | grep mysql, 但是第一种方法明显比第二种方法要少打几个字符了

7. 列出多个程序多打开的文件信息

lsof -c mysql -c apache

8. 列出某个用户以及某个程序所打开的文件信息

lsof -u test -c mysql

9. 列出除了某个用户外的被打开的文件信息

lsof -u ^root

备注:^这个符号在用户名之前,将会把是root用户打开的进程不让显示

10. 通过某个进程号显示该进行打开的文件

lsof -p 1

11. 列出多个进程号对应的文件信息

lsof -p 123,456,789

12. 列出除了某个进程号,其他进程号所打开的文件信息

lsof -p ^1

13 . 列出所有的网络连接

lsof -i

14. 列出所有tcp 网络连接信息

lsof -i tcp

15. 列出所有udp网络连接信息

lsof -i udp

16. 列出谁在使用某个端口

lsof -i :3306

17. 列出谁在使用某个特定的udp端口

lsof -i udp:55

18. 特定的tcp端口

lsof -i tcp:80

19. 列出某个用户的所有活跃的网络端口

lsof -a -u test -i

20. 列出所有网络文件系统

lsof -N

21.域名socket文件

lsof -u

22. 某个用户组所打开的文件信息

lsof -g 5555

23. 根据文件描述列出对应的文件信息

lsof -d description(like 2)

24. 根据文件描述范围列出文件信息

lsof -d 2-3

原文链接:https://blog.csdn.net/kozazyh/article/details/5495532

[踩坑] Mysql `for update` 行锁 踩坑

最近业务偶现并发问题. 举个例子:

-- 行锁
select * from `table` where id = 123 and a = 2 for update;

上面看似行锁 , 实际上使用 for update 需要配合索引去使用, 行锁/区间锁 都需要基于索引上锁.

table表仅 配置了 a 字段的索引, 所以上面的sql是区间锁.

解决问题就需要基于 where 条件设置索引.

Sourcetree 设置代理

Sourcetree 设置代理

在使用Sourcetree进行版本控制时,有时我们需要通过代理服务器连接到远程仓库。本文将介绍如何在Sourcetree中设置代理,以便顺利进行版本控制操作。

步骤

按照以下步骤设置Sourcetree的代理:

  1. 打开Sourcetree软件,并点击顶部菜单栏中的“工具”按钮。
  2. 在下拉菜单中选择“选项”。
  3. 在弹出的选项窗口中,选择“高级”选项卡。
  4. 在“网络”部分,找到“代理”设置。
  5. 选择“自定义”选项,并填写代理服务器的相关信息,包括代理类型、代理地址和端口号。
  6. (可选)如果代理服务器需要身份验证,勾选“需要身份验证”选项,并提供相应的用户名和密码。
  7. 单击“确定”保存设置。

完成以上步骤后,Sourcetree将使用指定的代理服务器进行远程仓库的连接和操作。

注意事项

在设置Sourcetree代理时,需要注意以下几点:

  1. 代理类型:根据实际情况选择合适的代理类型,包括HTTP代理、HTTPS代理或SOCKS代理。
  2. 代理地址和端口号:填写正确的代理服务器地址和端口号。可以咨询网络管理员或查看代理服务器的配置信息。
  3. 身份验证:如果代理服务器需要身份验证,请确保提供正确的用户名和密码。

参考文献

以下是一些相关的参考文献,供进一步学习和了解:

  1. Sourcetree官方文档:Proxy settings
  2. Stack Overflow上的讨论:How to set proxy settings for Sourcetree
  3. Sourcetree官方论坛:Proxy settings for Sourcetree

结论

通过按照上述步骤,在Sourcetree中正确设置代理,我们可以成功连接到远程仓库并进行版本控制操作。代理设置的准确性和有效性对于确保正常的代码管理和协作至关重要。

参考文章:Sourcetree 设置代理

Mysql 存储 Emoji 坑

Mysql 存储 Emoji 坑

在现代的应用程序中,Emoji表情符号已经成为用户之间交流的重要组成部分。然而,在将Emoji存储到MySQL数据库时,你可能会遇到一些问题。本文将介绍这些问题以及相应的解决方案。

问题描述

当我们尝试将包含Emoji的文本插入到MySQL数据库中时,可能会遇到以下问题:

  1. 存储问题:MySQL默认使用UTF-8字符集,但并不是所有的UTF-8编码都能正确地存储和处理Emoji字符。有些Emoji字符可能无法存储,或者在存储和检索过程中出现乱码或截断。
  2. 索引和排序问题:在进行索引和排序操作时,MySQL可能无法正确处理包含Emoji的字段。这可能导致排序结果不正确或无法正常使用索引。

解决方案

针对上述问题,我们可以采取以下解决方案:

  1. 选择合适的字符集和编码:为了正确地存储和处理Emoji字符,我们可以将MySQL的字符集和编码配置为utf8mb4。utf8mb4字符集支持四字节的UTF-8编码,可以存储包含Emoji的字符。
  2. 调整字段的长度:Emoji字符可能占用多个字节,因此在定义存储Emoji的字段时,确保字段长度足够容纳Emoji字符的字节数。根据具体情况,可以使用VARCHAR或TEXT类型,并根据需要设置适当的长度。
  3. 进行合适的索引和排序设置:如果需要在包含Emoji的字段上进行索引或排序,可以使用utf8mb4字符集,并为相应的字段创建合适的索引。

参考文献

以下是一些相关的参考文献,供进一步学习和了解:

  1. MySQL官方文档:Character Sets and Collations in MySQL
  2. Stack Overflow上的讨论:Storing Emoji in MySQL
  3. Medium上的文章:Storing Emoji in MySQL and Oracle

结论

通过选择正确的字符集和编码,调整字段长度,以及合适的索引和排序设置,我们可以在MySQL中成功存储和处理Emoji字符。这些解决方案可以确保我们的应用程序能够正确地处理用户之间的Emoji交流,并避免由于存储问题导致的数据损失或不一致性。

参考文章:Mysql 存储 Emoji 坑

希望本博客能对你理解和解决MySQL存储Emoji时的问题提供帮助。如果你需要更多的信息或有其他问题,请随时告诉我。

">