mysql实践总结

mysql相关命令

/* 列出服务器上的数据库 */
show databases;

/* 指定使用数据库 */
use 数据库名称;

/* 列出数据库的数据表 */
show tables;

/* 展示数据表结构 */
desc 数据表名称;

/* 获取数据表创建脚本 */
show create table 数据表名称;

/* 导出数据脚本(不带表结构)到 somedata1.sql文件 */
mysqldump -t 数据库名称 数据表名称 --where="1=1 limit 1"  -uroot -p > somedata1.sql

/* 向数据表加入新的一列 */
alter table TABLE_NAME add column NEW_COLUMN_NAME varchar(20) not null;

查询优化

获取查询命令的性能

使用Explain命令生成查询执行计划。
查询执行计划展示了sql语句的在mysql里面具体执行。

性能低

Type:all  // 全表扫描
Key:null   // 查询时没有使用索引
Extra:using where // 表示 MySQL 服务器先读取整行数据,再检查此行是否符合 where 句的条件,符合就留下,不符合便丢弃。效率较慢。

索引介绍

索引的原理是把原有的数据进行特定的数据结构(比如二叉平衡查找树)存储,方便程序进行查找和排序等等。

mysql的索引机制

  • 当表的某列设为主键,该列就是主键索引。

  • 当表的某列为unique约束时,这列就是唯一索引。
    unique字段可以为NULL,并可以有多NULL,即Null!=Null。但是如果是具体内容,则不能重复。

  • 当表的某列内容为文本,可以指定为全文索引。
    全文索引,只对MyISAM引擎有用。
    主要是针对对文件,文本的检索, 比如文章或者段落。
    mysql自己提供的fulltext针对英文生效,想要搜索中文需要使用sphinx全文检索引擎或者使用加强版的模糊查询。
    全文索引,相当于对文本进行了分词处理。

索引的代价

  • 存储空间更大
    原来是线性结构存储,现在是非线性结构存储。
    自然占用更多磁盘空间。

  • 增删改速度变慢
    为了维持二叉平衡查找树的完整性,增删操作效率会降低。

不使用索引的场景

  1. 数据唯一性差的字段不要使用索引
    比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描。

  2. 频繁更新的字段不要使用索引
    比如logincount登录次数,频繁变化导致索引也频繁变化,增大数据库工作量,降低效率。

  3. 字段不在where语句出现时不要添加索引
    只有在where语句出现,mysql才会去使用索引

  4. 数据量少的表不要使用索引
    使用了改善也不大

添加索引却没有被使用

  1. 创建的多列索引,如果查询条件没有使用最左边的列,索引就不会被使用。

  2. 条件中有or,条件中有一个字段没有添加索引,则不会使用索引。

  3. 列类型是字符串,那一定要在条件中将数据使用引号引用起来(表面这是一个字符串)。否则不使用索引。

  4. 只要模糊查询的模糊值在字符串前面,则不会使用索引。比如‘%aaa’和‘_aaa’都不会使用索引。
    ‘%aaa’和‘_aaa’都不会使用索引的解决方案:
    1.使用覆盖索引
    覆盖索引是一种特殊的多列索引,当多列索引指向一个查询语句中所有的字段时,该多列索引就被称为覆盖索引。

2.创建全文索引
注意:全文索引只适用于MyISAM引擎。而且查询条件恰好是分词出来的单词。

sql语句优化

  1. 尽量在索引中完成排序
  2. 减少扫描行数
select * from test1 where id>=100000 order by id limit 10
/* 接定位到100000查找 */

select * from test1 order by id limit 99999,10
/* 从第一行定位到99999行再去扫描后10行,相当于扫描全表 */
  1. 只取自己需要的列
/*也就是说避免*/
select * from table
  1. 阻止group by查询的默认排序操作
    使用group by分组查询完成后默认会排序,这会降低速度。
    可在group by后面增加order by null防止排序。

  2. 使用连接查询代替部分子查询
    因为子查询会在内存创建数据表。
    左外连接查询在所有连接查询中效率最高。

  3. 使用EXISTS代替IN
    首先几乎将所有的IN操作符子查询都能改写为使用EXISTS的子查询。
    IN子查询将内表和外表做一个笛卡尔积,然后按照条件进行筛选。
    EXISTS子查询遍历循环外表,然后看外表中的记录有没有和内表的数据一样的。匹配上就将结果放入结果集中。
    从运行机制上EXISTS比IN效率高。

数据表设计

  1. 先满足三范式,再添加冗余列。
    三范式本意是减少冗余。
    实际查询为了减少查询次数,故意冗余。
    所以实际操作准则是:
    先满足三范式设计表,再根据实际情况添加冗余列。

  2. 字段数目不要过多。
    如果表的某一个字段存储量大,但极少查询。可单独放到另一张表。

  3. 选择容量尽可能小的字段。

数据库配置优化

  1. 配置最大用户连接数和数据库最大连接数
    即max_user_connections和max_connections。

  2. 配置查询缓存
    在my.ini的[mysqld]节点开启查询缓存,配置如下

query_cache_size = 268435456

query_cache_type = 1

query_cache_limit = 1048576
  1. 使用存储过程
    因为无需编译。

  2. 使用分表。

参考

https://blog.csdn.net/World_2015/article/details/44994643

你可能感兴趣的:(mysql实践总结)