mysql数据库优化技巧

表的设计合理(字段合理,符合3NF)
添加适当索引(index)[主要4种:普通索引,主键索引,唯一索引unique,全文索引]
分表技术(水平分表->拆分表结构,垂直分表->根据适当的方式,将数据存储到不同的库表当中)
读写分离
存储过程(模块化编程,少去编译环节提高速度)
对mysql优化配置(最大连接数my.ini 或 my.cnf的参数max_connections,调整缓存大小)
mysql服务器硬件
定期维护清除不需要的数据,定时进行碎片整理(MyISAM)

1、表的设计合理(字段合理,符合3NF)

1NF:对属性的原则性约束,要求列具有原子性,不可再分解(只要是关系型数据库就自动满足1NF)
2NF:对记录的唯一性约束,要求记录有唯一标识,即实体的唯一性(一般通过添加主键实现)
3NF:对字段的冗余性约束,要求字段没有冗余(一般通过表的外键实现)
但是没有冗余的数据库未必就是好的设计方案,例如 商城用户下单的地址信息

2、SQL语句优化(慢查询)

show status;  //提供服务器的状态信息
show [session|global] status like 'com_select'; //select次数 默认为session 当前链接的统计结果,global表示数据库上次至今的统计结果
show STATUS like 'connections';//当前连接数
show STATUS like 'uptime';//服务器运行时间
show STATUS like 'slow_queries';//慢查询的次数 默认情况mysql中10秒以上为慢查询
show VARIABLES like 'long_query_time';//当前默认慢查询时间
set long_query_time=1;//设置慢查询时间
默认情况下:mysql不会记录慢查询,只有启动mysql时候,指定记录慢查询才可以
mysqld.exe --safe-mode --slow-query-log [版本5.5 可以在my.ini中指定]

查看开启慢查询

全文索引:

1.在mysql中fulltext 索引只针对 myisam生效
2.mysql自己提供的fulltext针对英文生效->sphinx (coreseek) 技术处理中文
3.使用方法是 match(字段名..) against(‘关键字’)
4.全文索引:停止词, 因为在一个文本中,创建索引是一个无穷大的数,因此,对一些常用词和字符,就不会创建,这些词,称为停止词.比如(a,b,mysql,the)
select match(title,body) against ('database') from articles;(输出的是每行和database的匹配度)

唯一索引:

unique字段可以为NULL,并可以有多NULL, 但是如果是具体内容,则不能重复,但是不能存有重复的空字符串’’

一般字段建立索引规则如下:

a.一般经常性放到where条件之后的
b.该字段内容不是唯一的固定几个值(例如:性别)
c.字段内容不是经常变化

索引的使用

查询需要使用索引最重要的是查询条件中需要使用索引

下面几种情况可能使用索引:
对于创建的多列索引,查询条件如果使用了最左边的列,索引一般会被使用(比如创建了 create index PersonIndex on Person(name,sex,age)相当于建立了(name)(name,sex)(name,sex,age) name是最左边的列,必须出现在where条件中,否则使用不了索引)
对于使用like查询,查询如果是“%aaa”不会使用索引,对于“aaa%”会使用到索引,如果一定需要前面有变化的值,则考虑使用全文索引(fulltext)或者sphinx(英文索引引擎),如果是中文,则考虑使用coreseek(sphinx中文版本 相当于sphinx+mmseg中文分词)
下列几种情况不会使用索引:
如果条件中有or ,即使有条件中带索引也不会使用,换言之,使用or条件就是要求使用的所有字段都必须建立索引,才能使用起来索引
对于多列索引,如果没有使用最左边的字段,也不会使用索引
like查询以%开头
如果字段类型是字符串,那一定要在条件中将数据使用引号引起来,否则不使用索引
如果mysql估计全表扫描比索引要快,则不使用索引

Sql语句优化:

在使用group by 分组查询是,默认分组后,还会排序,可能会降低速度,在group by 后面增加 order by null 就可以防止排序

mysql的索引和最左前缀原则:

通过实例理解单列索引、多列索引以及最左前缀原则

实例:现在我们想查出满足以下条件的用户id:
mysql>SELECT `uid` FROM people WHERE lname`='Liu' AND `fname`='Zhiqun' AND `age`=26
因为我们不想扫描整表,故考虑用索引。 单列索引:
ALTER TABLE people ADD INDEX lname (lname);
将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。 由 于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。 2.多列索引:
ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。 注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。 3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。 注:在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

mysql授权:

grant all privileges on *.* to zzp@'%' identified by '456852';

mysql的相关信息的更多相关文章

  1. Linux Mysql 权限相关信息 来源于网络

    查看用户权限 show grants for 你的用户 比如: show grants for root@’localhost’; mysql> use mysql; Database chan ...

  2. 查看mysql相关信息

    查看本机mysql的相关信息,执行以下SQL即可: SHOW VARIABLES LIKE "%char%";

  3. MySQL查看数据库相关信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令   1:查看显示所有数据库 mysql> show databases ...

  4. 查看mysql数据库连接数、并发数相关信息

    查看mysql数据库连接数.并发数相关信息. - caodongfang126的博客 - CSDN博客 https://blog.csdn.net/caodongfang126/article/det ...

  5. Mysql查看连接数相关信息

    MySQL查看连接数相关信息在 数据库:INFORMATION_SCHEMA 表:PROCESSLIST 表结构如下: mysql> desc PROCESSLIST; +---------+- ...

  6. (转)查看mysql数据库连接数、并发数相关信息

    查看mysql数据库连接数.并发数相关信息 1.mysql> show status like 'Threads%';+-------------------+-------+| Variabl ...

  7. [转]MySQL查看数据库相关信息

    原文链接:MySQL查看数据库相关信息 使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小.字符集.用户等等.下面总结了一些查看数据库相关信息的命令 1:查看显示所有数据库 mysql& ...

  8. mysql命令学习笔记(1):show table status like 'user';显示表的相关信息

    show table status like 'user';显示表的相关信息 +------------+--------+---------+------------+------+-------- ...

  9. Mysql优化相关总结

    Mysql优化相关总结 2016-05-31 数据库集中营 优化顺序: 选择适当的引擎和表结构和数据类型 建立索引,优化sql. 增加缓存,redis.memcache. 主从.主主,读写分离. my ...

随机推荐

  1. malloc 函数本身并不识别要申请的内存是什么类型

    malloc 函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数.我 们通常记不住 int, float 等数据类型的变量的确切字节数. 例如 int 变量在 16 位系统 下是 2 个字 ...

  2. 【BZOJ】1638: [Usaco2007 Mar]Cow Traffic 奶牛交通(dfs+dp)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1638 一条边(u, v)经过的数量=度0到u的数量×v到n的数量 两次记忆化dfs算出他们即可 #i ...

  3. mysql 分页sql

    -- pageSize=3 pageIndex total=7 -- 开始行号 startRowNum=(pageIndex-1)*pageSize+1; -- 结束行号 endRowNum=page ...

  4. linux系统命令记录

    系统 # uname -a # 查看内核/操作系统/CPU信息 # head -n 1 /etc/issue # 查看操作系统版本 # cat /proc/cpuinfo # 查看CPU信息 # ho ...

  5. mysql查询各种类型的前N条记录

    mysql查询各种类型的前N条记录,将3改为N(需查询条数)即可  (select * from event_info where event_type = 1  limit 3)union all( ...

  6. STL容器:deque双端队列学习

    所谓deque,是"double-ended queue"的缩写; 它是一种动态数组形式,可以向两端发展,在尾部和头部插入元素非常迅速; 在中间插入元素比较费时,因为需要移动其它元 ...

  7. WPF进阶之接口(3):INotifyPropertyChanged,ICommand

    INotifiPropertyChanged . 作用:向客户端发出某一属性值已更改的通知.该接口包含一个PropertyChanged事件成员(MSDN的解释) INotifyPropertyCha ...

  8. Spring JDBC样例

    这里介绍一下通过Spring JDBC的方式进行数据库的增删改查的操作.在进行程序的编写之前我们需要在本地MySQL数据库中创建一张User表,如下所示: create database user_d ...

  9. 在Hyper-V Linux VM如何选择LIS Linux集成服务

    导读 很多工程师都知道,如果你选择在 Hyper-V 中运行 Linux guest VM,要获得最好的使用体验,必需针对你所使用的 Linux 发行版和使用场景选择 Linux Integratio ...

  10. Ubuntu 中 apache 开启 rewrite 模块

    ubuntu14.04中安装好apache2.4之后默认rewrite模块是不开启的,项目public目录下的.htaccess文件就用不了,在浏览器中访问网页总是报500错误,原因就是这个. 执行下 ...