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. node.js发http请求

    标准库中默认的HTTP模块 const https = require('https'); https.get('https://api.nasa.gov/planetary/apod?api_key ...

  2. Javascript 验证上传图片大小[客户端验证]

    需求分析: 在做上传图片的时候,如果不限制上传图片大小,后果非常的严重.那么我们怎样才可以解决一个棘手的问题呢?有两种方式: 1)后台处理: 也就是AJAX POST提交到后台,把图片上传到服务器上, ...

  3. 关于Unity中的摄像机

    摄像机是挂载Camera组件的能把3D世界物体拍摄成2D画面显示到屏幕上面的节点,角度不一样,位置不一样,拍摄出来的东西就不一样. Clear Flags:没有物体的时候,摄像机拍摄出的屏幕要绘制什么 ...

  4. 关于Unity的坐标系

    1.坐标系分为左手坐标系和右手坐标系 2.用手从X轴旋到Y轴画一个弧,如果大拇指所指的方向是Z轴,那么这个坐标系就是这只手的坐标系 3.Unity是左手坐标系,OpenGl是右手坐标系 Unity坐标 ...

  5. Cocos2d-X中的Slider控件

    Slider控件事实上就是滑块控件.经常使用于音乐中的音量控制,在Windows编程中开发音乐播放器就须要用到滑块控件控制音量 首先在project文件夹下的Resource文件夹中放 在Skider ...

  6. Mac CEF 支持mp3 mp4编译

    1.下载:https://bitbucket.org/chromiumembedded/cef/wiki/BranchesAndBuilding   差不多15G 2.编译:https://bitbu ...

  7. UIStoryboard小提示

    - (id)instantiateInitialViewController - (id)instantiateViewControllerWithIdentifier:(NSString *)ide ...

  8. js小功能实现

    发送随机数手机验证码60秒倒计时 mm.mobileCheck = function(t){ var mobile = $("#user_mobile").val(); if(&q ...

  9. 二 Android Studio 打包EgretApp (开机画面、横竖屏、调试、和原生交互)

    测试环境: Windows7 Egret Engine 5.0.14 Egret support 5.0.12 Android Studio 2.3 目录: 一 修改开机画面 二 横竖屏设置 三 修改 ...

  10. 让asp.net程序在修改web.config后不重启

    默认情况下web.config修改后,asp.net程序会被重启.为了防止程序重启,要修改machine.config 文件. machine.config默认在C:\WINDOWS\Microsof ...