MySQL大数据量分页查询方法及其优化

方法1:直接使用数据库提供的SQL语句limit
方法2:建立主键或唯一索引, 利用索引(假设每页10条)
方法3:基于索引再排序
方法4:基于索引使用prepare(第一个问号表示pageNum,第二个?表示每页元组数)
方法5:利用MySQL支持ORDER操作可以利用索引快速定位部分元组,避免全表扫描
方法6:利用"子查询/连接+索引"快速定位元组的位置,然后再读取元组. 道理同方法5

分类至 MySQL
0条评论

MySQL EXPLAIN 命令详解

在工作中,我们用于捕捉性能问题最常用的就是打开慢查询,定位执行效率差的SQL,那么当我们定位到一个SQL以后还不算完事,我们还需要知道该SQL的执行计划,比如是全表扫描,还是索引扫描,这些都需要通过EXPLAIN去完成。EXPLAIN命令是查看优化器如何决定执行查询的主要方法。可以帮助我们深入了解MySQL的基于开销的优化器,还可以获得很多可能被优化器考虑到的访问策略的细节,以及当运行SQL语句时哪种策略预计会被优化器采用。需要注意的是,生成的QEP并不确定,它可能会根据很多因素发生改变。MySQL不会将一个QEP和某个给定查询绑定,QEP将由SQL语句每次执行时的实际情况确定,即便使用存储过程也是如此。尽管在存储过程中SQL语句都是预先解析过的,但QEP仍然会在每次调用存储过程的时候才被确定。

分类至 MySQL
0条评论

MySQL中的全文索引(InnoDB存储引擎)

5.6版本之后InnoDB存储引擎开始支持全文索引,5.7版本之后通过使用ngram插件开始支持中文。之前仅支持英文,因为是通过空格作为分词的分隔符,对于中文来说是不合适的。
MySQL允许在char、varchar、text类型上建立全文索引。
本文使用的MySQL 版本是5.7.24,InnoDB数据库引擎。

分类至 MySQL
0条评论

深入理解MySQL索引原理和实现——为什么索引可以加速查询?

说到索引,很多人都知道“索引是一个排序的列表,在这个列表中存储着索引的值和包含这个值的数据所在行的物理地址,在数据十分庞大的时候,索引可以大大加快查询的速度,这是因为使用索引后可以不用扫描全表来定位某行的数据,而是先通过索引表找到该行数据对应的物理地址然后访问相应的数据。”
但是索引是怎么实现的呢?因为索引并不是关系模型的组成部分,因此不同的DBMS有不同的实现,我们针对MySQL数据库的实现进行说明。本文内容涉及MySQL中索引的语法、索引的优缺点、索引的分类、索引的实现原理、索引的使用策略、索引的优化几部分。

分类至 MySQL
0条评论

MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁)

锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。
Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。

分类至 MySQL
0条评论

MySQL "ON DUPLICATE KEY UPDATE" 语法分析

mysql "ON DUPLICATE KEY UPDATE" 语法

如果在INSERT语句末尾指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则在出现重复值的行执行UPDATE;如果不会导致唯一值列重复的问题,则插入新行。 

例如,如果列 a 为 主键 或 拥有UNIQUE索引,并且包含值1,则以下两个语句具有相同的效果:

INSERT INTO TABLE (a,c) VALUES (1,3) ON DUPLICATE KEY UPDATE c=c+1;
UPDATE TABLE SET c=c+1 WHERE a=1;

如果行作为新记录被插入,则受影响行的值显示1;如果原有的记录被更新,则受影响行的值显示2。 

...

分类至 MySQL
0条评论

MySQL函数FIELD()用法

MySQL函数FIELD语法定义如下:

  • 语法:FIELD(str, str1, str2, str3, ...)
  • 解释:返回 str1,str2,str3,... 列表中str的索引(位置)。 如果未找到str,则返回0。如果FIELD()的所有参数都是字符串,则所有参数都将作为字符串进行比较。如果所有参数都是数字,则将它们作为数字进行比较。 否则,参数将进行两次比较。如果str为NULL,则返回值为0,因为NULL无法与任何值进行相等性比较。FIELD()和ELT()互补。
分类至 MySQL
0条评论

MySQL函数FIND_IN_SET()用法

MySQL函数FIND_IN_SET语法定义如下:

  • 语法:FIND_IN_SET(str, strlist) 
  • 解释:如果字符串str位于由N个子字符串组成的字符串列表strlist中,则返回1到N范围内的值。 strlist列表是一系列子串以英文逗号(,)拼接而成的字符串。 如果第一个参数是常量字符串而第二个参数是SET类型的列,则FIND_IN_SET()函数被优化为使用位算术。 如果str不在strlist中,或者strlist是空字符串,则返回0。 如果任一参数为NULL,则返回NULL。 如果第一个参数包含英文逗号(,)字符,则此函数无法正常工作。

 

分类至 MySQL
0条评论

MySQL函数GROUP_CONCAT()用法

先来看看官方手册对 GROUP_CONCAT 说明:

此函数返回一个字符串,是查询结果集合中指定列非NULL值的串联。如果所有列都是NULL,则此函数返回NULL。完整语法如下:

GROUP_CONCAT([DISTINCT] expr [,expr ...]
             [ORDER BY {unsigned_integer | col_name | expr}
                 [ASC | DESC] [,col_name ...]]
             [SEPARATOR str_val])

GROUP_CONCAT 是一个聚合函数,通常跟 GROUP BY 一起使用。

分类至 MySQL
0条评论

MySQL5.7重置root密码

本人由于root密码设置太复杂,距离买云服务器过去好长时间,记不起来了,只好重置密码。

编辑配置文件/etc/my.cnf,在 [mysqld] 段加入一行:skip-grant-tables

如下:

[mysqld]
skip-grant-tables
skip-ssl
port = 3306
......

分类至 MySQL
1条评论