葡京在线开户稳扎稳打Silverlight(27) – 2.0网页的可下本化, 与DOM的相, 与JavaScript的互

[索引页]
[源码下载]

本文地址

稳扎稳打Silverlight(27) – 2.0网页的可下本化, 与DOM的并行,
与JavaScript的互相

享受提纲:

作者:webabcd

葡京在线开户 1葡京在线开户 2

介绍
Silverlight
2.0 使用c#支出可下本化的代码,Silverlight与宿主页面的DOM之间的相,Silverlight与宿主页面的JavaScript之间的彼此
    ScriptableMemberAttribute – 需要脚本化的性质、方法、事件而记为这
    HtmlPage.RegisterScriptableObject – 将只是下本化对象注册及客户端
    HtmlElement –  表示网页的文档对象模型 (DOM) 中之 HTML 元素
    HtmlWindow – 提供 JavaScript 的 window 对象的 Silverlight
端的托管意味着形式

1.为查询缓存优化你的查询

  2. EXPLAIN 你的 SELECT 查询

  3. 当只要一行数据时使用 LIMIT 1

  4. 为搜索字段建索引

  5. 在Join表的时候使用相当类型的例,并将其索引

  6. 千万不要 ORDER BY RAND()

  7. 避免 SELECT *

  8. 永远为每张表设置一个ID

  9. 使用 ENUM 而不是 VARCHAR

  10. 从 PROCEDURE ANALYSE() 取得建议

  11. 尽可能的使用 NOT NULL

  12. Prepared Statements

  13. 无缓冲的查询

  14. 把IP地址存成 UNSIGNED INT

  15.  固定长度的表会更快

  16. 垂直分割

  17. 拆分大的 DELETE 或 INSERT 语句

  18. 越小的列会越快

  19. 选择正确的存储引擎

  20. 使用一个对象关系映射器(Object Relational Mapper)

  21. 小心“永久链接”

  22. mysql强制索引和禁止某个索引

在线DEMO
http://www.cnblogs.com/webabcd/archive/2008/10/09/1307486.html

分享提纲

示例
1、Silverlight对而下面本化的支撑
Scriptable.cs

 

葡京在线开户 3using System;
葡京在线开户 4using System.Net;
葡京在线开户 5using System.Windows;
葡京在线开户 6using System.Windows.Controls;
葡京在线开户 7using System.Windows.Documents;
葡京在线开户 8using System.Windows.Ink;
葡京在线开户 9using System.Windows.Input;
葡京在线开户 10using System.Windows.Media;
葡京在线开户 11using System.Windows.Media.Animation;
葡京在线开户 12using System.Windows.Shapes;
葡京在线开户 13
葡京在线开户 14using System.Windows.Browser;
葡京在线开户 15
葡京在线开户 16namespace Silverlight20.WebPage
葡京在线开户 17葡京在线开户 18葡京在线开户 19{
葡京在线开户 20葡京在线开户 21    /**//*
葡京在线开户 22     * 脚本化的类必须是 public 的
葡京在线开户 23     * 需要脚本化的性质、方法、事件如果记为 [ScriptableMember]
葡京在线开户 24     * 如果类似吃标记为 [ScriptableType],则代表该性能、方法、事件还是ScriptableMemberAttribute
葡京在线开户 25     */
葡京在线开户 26
葡京在线开户 27葡京在线开户 28    /**//// <summary>
葡京在线开户 29    /// 用于演示脚本化的好像
葡京在线开户 30    /// </summary>
葡京在线开户 31    // [ScriptableType]
葡京在线开户 32    public class Scriptable
葡京在线开户 33葡京在线开户 34    葡京在线开户 35{
葡京在线开户 36葡京在线开户 37        /**//// <summary>
葡京在线开户 38        /// 当前劳动端的时光
葡京在线开户 39        /// </summary>
葡京在线开户 40        [ScriptableMember]
葡京在线开户 41葡京在线开户 42        public DateTime CurrentTime 葡京在线开户 43{ get; set; }
葡京在线开户 44
葡京在线开户 45葡京在线开户 46        /**//// <summary>
葡京在线开户 47        /// Hello 方法
葡京在线开户 48        /// </summary>
葡京在线开户 49        /// <param name=”name”>名字</param>
葡京在线开户 50        /// <returns></returns>
葡京在线开户 51        [ScriptableMember]
葡京在线开户 52        public string Hello(string name)
葡京在线开户 53葡京在线开户 54        葡京在线开户 55{
葡京在线开户 56            return string.Format(“Hello: {0}”, name);
葡京在线开户 57        }
葡京在线开户 58        
葡京在线开户 59葡京在线开户 60        /**//// <summary>
葡京在线开户 61        /// 开始事件
葡京在线开户 62        /// </summary>
葡京在线开户 63        [ScriptableMember]
葡京在线开户 64        public event EventHandler<StartEventArgs> Start;
葡京在线开户 65
葡京在线开户 66葡京在线开户 67        /**//// <summary>
葡京在线开户 68        /// 触发开始事件所调用的道
葡京在线开户 69        /// </summary>
葡京在线开户 70        /// <param name=”dt”></param>
葡京在线开户 71        public void OnStart(DateTime dt)
葡京在线开户 72葡京在线开户 73        葡京在线开户 74{
葡京在线开户 75            if (Start != null)
葡京在线开户 76葡京在线开户 77            葡京在线开户 78{
葡京在线开户 79                Start(this, new StartEventArgs()
葡京在线开户 80葡京在线开户 81                葡京在线开户 82{
葡京在线开户 83                    CurrentTime = dt
葡京在线开户 84                });
葡京在线开户 85            }
葡京在线开户 86        }
葡京在线开户 87
葡京在线开户 88    }
葡京在线开户 89
葡京在线开户 90葡京在线开户 91    /**//// <summary>
葡京在线开户 92    /// 开始事件的 EventArgs
葡京在线开户 93    /// </summary>
葡京在线开户 94    public class StartEventArgs : EventArgs
葡京在线开户 95葡京在线开户 96    葡京在线开户 97{
葡京在线开户 98葡京在线开户 99        /**//// <summary>
葡京在线开户 100        /// 当前服务端的日
葡京在线开户 101        /// </summary>
葡京在线开户 102        [ScriptableMember]
葡京在线开户 103葡京在线开户 104        public DateTime CurrentTime 葡京在线开户 105{ get; set; }
葡京在线开户 106    }
葡京在线开户 107}
葡京在线开户 108

 

ScriptableDemo.xaml.cs

  今天,数据库的操作逾成为全体应用的性质瓶颈了,这点于Web应用越来越引人注目。
关于数据库的特性,这并无特是DBA才用担心的从业,而就更是自我
们程序员需要去关爱的事务。当我们失去规划数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们还需要专注数据操作的性能。这里,我们不见面摆了
多之SQL语句的优化,而止是对准MySQL这同样Web应用最多的数据库。希望下的这些优化技术对您来因此。

葡京在线开户 109using System;
葡京在线开户 110using System.Collections.Generic;
葡京在线开户 111using System.Linq;
葡京在线开户 112using System.Net;
葡京在线开户 113using System.Windows;
葡京在线开户 114using System.Windows.Controls;
葡京在线开户 115using System.Windows.Documents;
葡京在线开户 116using System.Windows.Input;
葡京在线开户 117using System.Windows.Media;
葡京在线开户 118using System.Windows.Media.Animation;
葡京在线开户 119using System.Windows.Shapes;
葡京在线开户 120
葡京在线开户 121using System.Windows.Browser;
葡京在线开户 122
葡京在线开户 123namespace Silverlight20.WebPage
葡京在线开户 124葡京在线开户 125葡京在线开户 126{
葡京在线开户 127    public partial class ScriptableDemo : UserControl
葡京在线开户 128葡京在线开户 129    葡京在线开户 130{
葡京在线开户 131        System.Threading.Timer _timer;
葡京在线开户 132        System.Threading.SynchronizationContext _syncContext;
葡京在线开户 133
葡京在线开户 134        public ScriptableDemo()
葡京在线开户 135葡京在线开户 136        葡京在线开户 137{
葡京在线开户 138            InitializeComponent();
葡京在线开户 139
葡京在线开户 140            this.Loaded += new RoutedEventHandler(ScriptableDemo_Loaded);
葡京在线开户 141        }
葡京在线开户 142
葡京在线开户 143        void ScriptableDemo_Loaded(object sender, RoutedEventArgs e)
葡京在线开户 144葡京在线开户 145        葡京在线开户 146{
葡京在线开户 147            // UI 线程
葡京在线开户 148            _syncContext = System.Threading.SynchronizationContext.Current;
葡京在线开户 149
葡京在线开户 150葡京在线开户 151            Scriptable s = new Scriptable() 葡京在线开户 152{ CurrentTime = DateTime.Now };
葡京在线开户 153
葡京在线开户 154            // 将 Scriptable 对象注册到客户端挨,所对应之客户端的目标名也 scriptable
葡京在线开户 155            HtmlPage.RegisterScriptableObject(“scriptable”, s);
葡京在线开户 156
葡京在线开户 157            _timer = new System.Threading.Timer(MyTimerCallback, s, 0, 1000);
葡京在线开户 158        }
葡京在线开户 159
葡京在线开户 160        private void MyTimerCallback(object state)
葡京在线开户 161葡京在线开户 162        葡京在线开户 163{
葡京在线开户 164            Scriptable s = state as Scriptable;
葡京在线开户 165
葡京在线开户 166            // 每秒调用平等差 UI 线程上的指定的计
葡京在线开户 167            _syncContext.Post(OnStart, s);
葡京在线开户 168        }
葡京在线开户 169
葡京在线开户 170        void OnStart(object state)
葡京在线开户 171葡京在线开户 172        葡京在线开户 173{
葡京在线开户 174            Scriptable s = state as Scriptable;
葡京在线开户 175
葡京在线开户 176            // 调用 Scriptable 对象的 OnStart() 方法,以触发 Start 事件
葡京在线开户 177            s.OnStart(DateTime.Now);
葡京在线开户 178        }
葡京在线开户 179    }
葡京在线开户 180}
葡京在线开户 181

 

ScriptableDemo.html

  1. 也查询缓存优化你的查询

葡京在线开户 182<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
葡京在线开户 183<html xmlns=”http://www.w3.org/1999/xhtml"&gt;
葡京在线开户 184<head>
葡京在线开户 185    <title>Silverlight20</title>
葡京在线开户 186葡京在线开户 187    <style type=”text/css”>葡京在线开户 188
葡京在线开户 189        html, body
葡京在线开户 190葡京在线开户 191        {葡京在线开户 192}{
葡京在线开户 193            height: 100%;
葡京在线开户 194            overflow: auto;
葡京在线开户 195        }
葡京在线开户 196        body
葡京在线开户 197葡京在线开户 198        {葡京在线开户 199}{
葡京在线开户 200            padding: 0;
葡京在线开户 201            margin: 0;
葡京在线开户 202        }
葡京在线开户 203        #silverlightControlHost
葡京在线开户 204葡京在线开户 205        {葡京在线开户 206}{
葡京在线开户 207            height: 100%;
葡京在线开户 208        }
葡京在线开户 209    </style>
葡京在线开户 210
葡京在线开户 211    <script type=”text/javascript” src=”../Silverlight.js”></script>
葡京在线开户 212
葡京在线开户 213葡京在线开户 214    <script type=”text/javascript”>葡京在线开户 215
葡京在线开户 216葡京在线开户 217        function scriptableDemo() 葡京在线开户 218{
葡京在线开户 219
葡京在线开户 220            // scriptable – Silverlight 注册及客户端的目标
葡京在线开户 221            var obj = document.getElementById(“xaml1”).content.scriptable;
葡京在线开户 222            var output = document.getElementById(‘result’);
葡京在线开户 223
葡京在线开户 224            output.innerHTML += obj.CurrentTime
葡京在线开户 225            output.innerHTML += ‘<br />’;
葡京在线开户 226
葡京在线开户 227            output.innerHTML += obj.Hello(“webabcd”);
葡京在线开户 228            output.innerHTML += ‘<br />’;
葡京在线开户 229
葡京在线开户 230            // obj.Start = responseStart;
葡京在线开户 231            // addEventListener – 添加事件监听器
葡京在线开户 232            // removeEventListener – 移除事件监听器
葡京在线开户 233            obj.addEventListener(“Start”, responseStart);
葡京在线开户 234        }
葡京在线开户 235
葡京在线开户 236葡京在线开户 237        function responseStart(sender, args) 葡京在线开户 238{
葡京在线开户 239            document.getElementById(‘result’).innerHTML += args.CurrentTime;
葡京在线开户 240            document.getElementById(‘result’).innerHTML += ‘<br />’;
葡京在线开户 241        }
葡京在线开户 242    </script>
葡京在线开户 243
葡京在线开户 244</head>
葡京在线开户 245<body>
葡京在线开户 246    <div style=”font-size: 12px” id=”result”>
葡京在线开户 247    </div>
葡京在线开户 248    <div style=”font-size: 12px” onclick=”scriptableDemo();”>
葡京在线开户 249        加载了 Silverlight20.WebPage.ScriptableDemo 后,单击这里坐测试 Silverlight 对而下本化的支持</div>
葡京在线开户 250    <div id=”silverlightControlHost”>
葡京在线开户 251        <object id=”xaml1″ data=”data:application/x-silverlight-2,” type=”application/x-silverlight-2″
葡京在线开户 252            width=”100%” height=”100%”>
葡京在线开户 253            <param name=”source” value=”../ClientBin/Silverlight20.xap” />
葡京在线开户 254            <param name=”EnableHtmlAccess” value=”true” />
葡京在线开户 255        </object>
葡京在线开户 256        <iframe style=’visibility: hidden; height: 0; width: 0; border: 0px’></iframe>
葡京在线开户 257    </div>
葡京在线开户 258</body>
葡京在线开户 259</html>
葡京在线开户 260

大部的MySQL服务器都开了查询缓存。这是提高性最得力之艺术之一,而且这是吃MySQL的数据库引擎处理的。当有广大均等之询问被执行了累的时候,这些查询结果碰头叫撂一个缓存中,这样,后续的等同之询问就毫无操作表而一直访问缓存结果了。

2、Silverlight与网页的DOM之间的相
DOMDemo.xaml

此地最关键的题材是,对于程序员来说,这个工作是十分爱给忽视的。因为,我们一点查询语句会于MySQL不采用缓存。请看下面的演示:

葡京在线开户 261<UserControl x:Class=”Silverlight20.WebPage.DOMDemo”
葡京在线开户 262    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
葡京在线开户 263    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"&gt;
葡京在线开户 264    <StackPanel HorizontalAlignment=”Left” Margin=”5″>
葡京在线开户 265
葡京在线开户 266        <TextBox x:Name=”txtMsg” />
葡京在线开户 267        
葡京在线开户 268    </StackPanel>
葡京在线开户 269</UserControl>
葡京在线开户 270

葡京在线开户 271

DOMDemo.xaml.cs

 

葡京在线开户 272using System;
葡京在线开户 273using System.Collections.Generic;
葡京在线开户 274using System.Linq;
葡京在线开户 275using System.Net;
葡京在线开户 276using System.Windows;
葡京在线开户 277using System.Windows.Controls;
葡京在线开户 278using System.Windows.Documents;
葡京在线开户 279using System.Windows.Input;
葡京在线开户 280using System.Windows.Media;
葡京在线开户 281using System.Windows.Media.Animation;
葡京在线开户 282using System.Windows.Shapes;
葡京在线开户 283
葡京在线开户 284using System.Windows.Browser;
葡京在线开户 285
葡京在线开户 286namespace Silverlight20.WebPage
葡京在线开户 287葡京在线开户 288葡京在线开户 289{
葡京在线开户 290    public partial class DOMDemo : UserControl
葡京在线开户 291葡京在线开户 292    葡京在线开户 293{
葡京在线开户 294        public DOMDemo()
葡京在线开户 295葡京在线开户 296        葡京在线开户 297{
葡京在线开户 298            InitializeComponent();
葡京在线开户 299
葡京在线开户 300            Demo();
葡京在线开户 301        }
葡京在线开户 302
葡京在线开户 303        void Demo()
葡京在线开户 304葡京在线开户 305        葡京在线开户 306{
葡京在线开户 307            // 获取当前页面的 id 为 hello 的DOM,并安装其样式
葡京在线开户 308            HtmlElement container = HtmlPage.Document.GetElementById(“hello”);
葡京在线开户 309            container.SetStyleAttribute(“display”, “block”);
葡京在线开户 310
葡京在线开户 311            // 创建一个 ul 
葡京在线开户 312            HtmlElement ul = HtmlPage.Document.CreateElement(“ul”);
葡京在线开户 313
葡京在线开户 314            for (int i = 0; i < 10; i++)
葡京在线开户 315葡京在线开户 316            葡京在线开户 317{
葡京在线开户 318                // 创建一个 li ,并设置其出示的情
葡京在线开户 319                HtmlElement li = HtmlPage.Document.CreateElement(“li”);
葡京在线开户 320                li.SetAttribute(“innerText”, “hi: DOM”);
葡京在线开户 321
葡京在线开户 322                // 将 li 添加到 ul 内
葡京在线开户 323                ul.AppendChild(li);
葡京在线开户 324            }
葡京在线开户 325
葡京在线开户 326            // 将 ul 添加到 id 为 hello 的 DOM 内
葡京在线开户 327            container.AppendChild(ul);
葡京在线开户 328
葡京在线开户 329
葡京在线开户 330            // 创建一个页面的 button ,并安装其 value 属性和 onclick 事件
葡京在线开户 331            HtmlElement button = HtmlPage.Document.CreateElement(“button”);
葡京在线开户 332            button.SetProperty(“value”, “hi: Silverlight”);
葡京在线开户 333            button.AttachEvent(“onclick”, new EventHandler<HtmlEventArgs>(HelloClick));
葡京在线开户 334
葡京在线开户 335            // 将 button 添加到 id 为 hello 的 DOM 内
葡京在线开户 336            container.AppendChild(button);
葡京在线开户 337        }
葡京在线开户 338
葡京在线开户 339        void HelloClick(object sender, HtmlEventArgs e)
葡京在线开户 340葡京在线开户 341        葡京在线开户 342{
葡京在线开户 343            // 页面的 button 单击后所欲实施的逻辑
葡京在线开户 344            txtMsg.Text += “hi: Silverlight\r\n”;
葡京在线开户 345        }
葡京在线开户 346    }
葡京在线开户 347}
葡京在线开户 348

 

DOMDemo.html

上面两长SQL语句之别就是 CURDATE()
,MySQL的查询缓存对斯函数不起作用。所以,像 NOW() 和 RAND()
或是其它的这么的SQL函数都未会见开启查询缓存,因为这些函数的归来是会无自然的易变的。所以,你所欲的便是为此一个变量来顶替MySQL的函数,从而
开启缓存。

葡京在线开户 349<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
葡京在线开户 350<html xmlns=”http://www.w3.org/1999/xhtml"&gt;
葡京在线开户 351<head>
葡京在线开户 352    <title>Silverlight20</title>
葡京在线开户 353葡京在线开户 354    <style type=”text/css”>葡京在线开户 355
葡京在线开户 356        html, body
葡京在线开户 357葡京在线开户 358        {葡京在线开户 359}{
葡京在线开户 360            height: 100%;
葡京在线开户 361            overflow: auto;
葡京在线开户 362        }
葡京在线开户 363        body
葡京在线开户 364葡京在线开户 365        {葡京在线开户 366}{
葡京在线开户 367            padding: 0;
葡京在线开户 368            margin: 0;
葡京在线开户 369        }
葡京在线开户 370        #silverlightControlHost
葡京在线开户 371葡京在线开户 372        {葡京在线开户 373}{
葡京在线开户 374            height: 100%;
葡京在线开户 375        }
葡京在线开户 376    </style>
葡京在线开户 377
葡京在线开户 378    <script type=”text/javascript” src=”../Silverlight.js”></script>
葡京在线开户 379
葡京在线开户 380</head>
葡京在线开户 381<body>
葡京在线开户 382    <!–由 Silverlight 控制此 id 为 hello 的 DOM–>
葡京在线开户 383    <div style=”font-size: 12px; display: none” id=”hello”>
葡京在线开户 384    </div>
葡京在线开户 385    <div style=”font-size: 12px”>
葡京在线开户 386        加载 Silverlight20.WebPage.DOMDemo 后,测试 Silverlight 和页面 DOM 的交互</div>
葡京在线开户 387    <div id=”silverlightControlHost”>
葡京在线开户 388        <object id=”xaml1″ data=”data:application/x-silverlight-2,” type=”application/x-silverlight-2″
葡京在线开户 389            width=”100%” height=”100%”>
葡京在线开户 390            <param name=”source” value=”../ClientBin/Silverlight20.xap” />
葡京在线开户 391            <param name=”EnableHtmlAccess” value=”true” />
葡京在线开户 392        </object>
葡京在线开户 393        <iframe style=’visibility: hidden; height: 0; width: 0; border: 0px’></iframe>
葡京在线开户 394    </div>
葡京在线开户 395</body>
葡京在线开户 396</html>
葡京在线开户 397

  2. EXPLAIN 你的 SELECT 查询

3、Silverlight与网页的JavaScript之间的相
JSDemo.xaml

动用 EXPLAIN
关键字可以给您了解MySQL是安处理你的SQL语句的。这足以拉您解析你的询问语句或是表结构的性质瓶颈。

葡京在线开户 398<UserControl x:Class=”Silverlight20.WebPage.JSDemo”
葡京在线开户 399    xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation” 
葡京在线开户 400    xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml"&gt;
葡京在线开户 401    <StackPanel HorizontalAlignment=”Left” Margin=”5″>
葡京在线开户 402
葡京在线开户 403        <Button Margin=”5″ x:Name=”invokeJS” Content=”调用JavaScript” Click=”invokeJS_Click” />
葡京在线开户 404        
葡京在线开户 405        <TextBox Margin=”5″ x:Name=”txtMsg” />
葡京在线开户 406
葡京在线开户 407    </StackPanel>
葡京在线开户 408</UserControl>
葡京在线开户 409

EXPLAIN
的查询结果还见面报您乃的目录主键被如何用的,你的数据表是何许吃搜寻以及排序的……等等,等等。

JSDemo.xaml.cs

挑一个若的SELECT语句(推荐挑选非常最复杂的,有差不多表接的),把重点字EXPLAIN加到前面。你得应用phpmyadmin来开这从。然后,你会盼同样摆表。下面的斯示例中,我们忘记加上了group_id索引,并且有表联接:

葡京在线开户 410using System;
葡京在线开户 411using System.Collections.Generic;
葡京在线开户 412using System.Linq;
葡京在线开户 413using System.Net;
葡京在线开户 414using System.Windows;
葡京在线开户 415using System.Windows.Controls;
葡京在线开户 416using System.Windows.Documents;
葡京在线开户 417using System.Windows.Input;
葡京在线开户 418using System.Windows.Media;
葡京在线开户 419using System.Windows.Media.Animation;
葡京在线开户 420using System.Windows.Shapes;
葡京在线开户 421
葡京在线开户 422using System.Windows.Browser;
葡京在线开户 423
葡京在线开户 424namespace Silverlight20.WebPage
葡京在线开户 425葡京在线开户 426葡京在线开户 427{
葡京在线开户 428    public partial class JSDemo : UserControl
葡京在线开户 429葡京在线开户 430    葡京在线开户 431{
葡京在线开户 432        public JSDemo()
葡京在线开户 433葡京在线开户 434        葡京在线开户 435{
葡京在线开户 436            InitializeComponent();
葡京在线开户 437
葡京在线开户 438            this.Loaded += new RoutedEventHandler(JSDemo_Loaded);
葡京在线开户 439        }
葡京在线开户 440
葡京在线开户 441        private void invokeJS_Click(object sender, RoutedEventArgs e)
葡京在线开户 442葡京在线开户 443        葡京在线开户 444{
葡京在线开户 445            // 调用页面的 JavaScript 方法
葡京在线开户 446            HtmlPage.Window.Invoke(“silverlightInvokeJS”, “webabcd”);
葡京在线开户 447
葡京在线开户 448            // 执行任意 JavaScript 语句
葡京在线开户 449            HtmlPage.Window.Eval(“silverlightInvokeJS(‘webabcd2’)”);
葡京在线开户 450        }
葡京在线开户 451
葡京在线开户 452        void JSDemo_Loaded(object sender, RoutedEventArgs e)
葡京在线开户 453葡京在线开户 454        葡京在线开户 455{
葡京在线开户 456            HtmlPage.Document.GetElementById(“btnHello”).SetStyleAttribute(“display”, “inline”);
葡京在线开户 457
葡京在线开户 458            // 将之目标注册到客户端着,所对应之客户端的对象名吧 silverlightObject
葡京在线开户 459            HtmlPage.RegisterScriptableObject(“silverlightObject”, this);
葡京在线开户 460        }
葡京在线开户 461
葡京在线开户 462葡京在线开户 463        /**//// <summary>
葡京在线开户 464        /// Hello 方法
葡京在线开户 465        /// 暴露于页面的方式,调用后以 Silverlight 中显示结果
葡京在线开户 466        /// </summary>
葡京在线开户 467        /// <param name=”name”>名字</param>
葡京在线开户 468        [ScriptableMember] // 脚本化此道
葡京在线开户 469        public void hello(string name)
葡京在线开户 470葡京在线开户 471        葡京在线开户 472{
葡京在线开户 473            txtMsg.Text += string.Format(“Hello: {0}\r\n”, name);
葡京在线开户 474        }
葡京在线开户 475    }
葡京在线开户 476}
葡京在线开户 477

葡京在线开户 478

JSDemo.html

 

葡京在线开户 479<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"&gt;
葡京在线开户 480<html xmlns=”http://www.w3.org/1999/xhtml"&gt;
葡京在线开户 481<head>
葡京在线开户 482    <title>Silverlight20</title>
葡京在线开户 483葡京在线开户 484    <style type=”text/css”>葡京在线开户 485
葡京在线开户 486        html, body
葡京在线开户 487葡京在线开户 488        {葡京在线开户 489}{
葡京在线开户 490            height: 100%;
葡京在线开户 491            overflow: auto;
葡京在线开户 492        }
葡京在线开户 493        body
葡京在线开户 494葡京在线开户 495        {葡京在线开户 496}{
葡京在线开户 497            padding: 0;
葡京在线开户 498            margin: 0;
葡京在线开户 499        }
葡京在线开户 500        #silverlightControlHost
葡京在线开户 501葡京在线开户 502        {葡京在线开户 503}{
葡京在线开户 504            height: 100%;
葡京在线开户 505        }
葡京在线开户 506    </style>
葡京在线开户 507
葡京在线开户 508    <script type=”text/javascript” src=”../Silverlight.js”></script>
葡京在线开户 509
葡京在线开户 510葡京在线开户 511    <script type=”text/javascript”>葡京在线开户 512
葡京在线开户 513葡京在线开户 514        function silverlightInvokeJS(name) 葡京在线开户 515{
葡京在线开户 516            // Silverlight 调用 JavaScript 方法,在页面及展示结果
葡京在线开户 517            document.getElementById(‘result’).innerHTML += “hello: ” + name + “<br />”;
葡京在线开户 518        }
葡京在线开户 519
葡京在线开户 520葡京在线开户 521        function jsInvokeSilverlight(name) 葡京在线开户 522{
葡京在线开户 523            // JavaScript 调用 Silverlight 方法,在 Silverlight 上显示结果
葡京在线开户 524            var obj = document.getElementById(“xaml1”).content.silverlightObject;
葡京在线开户 525            obj.hello(name);
葡京在线开户 526        }
葡京在线开户 527    </script>
葡京在线开户 528
葡京在线开户 529</head>
葡京在线开户 530<body>
葡京在线开户 531    <div style=”font-size: 12px” id=”result”>
葡京在线开户 532    </div>
葡京在线开户 533    <div style=”font-size: 12px”>
葡京在线开户 534        加载 Silverlight20.WebPage.JSDemo 后,测试 Silverlight 和页面 JavaScript 的交互  
葡京在线开户 535        <input type=”button” id=”btnHello” value=”HelloSilverlight” onclick=”jsInvokeSilverlight(‘webabcd’)”
葡京在线开户 536            style=”display: none” />
葡京在线开户 537    </div>
葡京在线开户 538    <div id=”silverlightControlHost”>
葡京在线开户 539        <object id=”xaml1″ data=”data:application/x-silverlight-2,” type=”application/x-silverlight-2″
葡京在线开户 540            width=”100%” height=”100%”>
葡京在线开户 541            <param name=”source” value=”../ClientBin/Silverlight20.xap” />
葡京在线开户 542            <param name=”EnableHtmlAccess” value=”true” />
葡京在线开户 543        </object>
葡京在线开户 544        <iframe style=’visibility: hidden; height: 0; width: 0; border: 0px’></iframe>
葡京在线开户 545    </div>
葡京在线开户 546</body>
葡京在线开户 547</html>
葡京在线开户 548

当我们吧 group_id 字段长索引后:

OK
[源码下载]

葡京在线开户 549

 

 

咱俩可见到,前一个结果显示搜索了 7883 行,而后一个单独是摸索了个别独说明底 9
和 16 行。查看rows列可以叫咱找到黑的性问题。

  3. 当只要一行数经常行使 LIMIT 1

当您查询表的略微上,你曾经了解结果只有见面发同漫漫结果,但因为若也许需要去fetch游标,或是你或会失掉反省返回的记录数。

在这种情景下,加上 LIMIT 1
可长性能。这样同样,MySQL数据库引擎会在找到同样长数据后终止搜索,而未是继续往后翻看少生同样修适合记录之数。

脚的示范,只是为着寻找一下是否生“中国”的用户,很显然,后面的会见于前的还有效率。(请小心,第一漫长受凡Select
*,第二漫漫是Select 1)

葡京在线开户 550

 

 

  4. 也找字段建索引

目录并不一定就是让主键或是唯一的字段。如果当您的表中,有有字段你说到底要会常用来举行搜索,那么,请也那成立目录吧。

葡京在线开户 551

 

 

由达图你可观看那个搜索字串 “last_name LIKE
‘a%’”,一个是构筑了目录,一个凡是从未有过索引,性能差了4加倍左右。

除此以外,你该吗欲理解哪的检索是免能够用正规的目录的。例如,当你得在同一篇雅的文章被查找一个词时,如:
“WHERE post_content LIKE
‘%apple%’”,索引可能是从未有过意思之。你可能需要动用MySQL全文索引
或是自己举行一个目录(比如说:搜索关键词或是Tag什么的)

  5. 在Join表的时光利用相当类型的条例,并拿其索引

只要您的应用程序有成百上千 JOIN
查询,你当肯定个别单说明中Join的字段是叫盘了索引的。这样,MySQL内部会启动为你优化Join的SQL语句的编制。

而且,这些受用来Join的字段,应该是千篇一律的型的。例如:如果您要是将 DECIMAL
字段和一个 INT
字段Join于一块,MySQL就无法利用它们的目。对于那些STRING类型,还得发出一致的字符集才行。(两只说明底字符集有或未平等)

葡京在线开户 552

 

  6.绝不要 ORDER BY RAND()**

想念打乱返回的数据行?随机挑一个数?真不知道谁发明了这种用法,但广大新手很欣赏这样用。但若真无了解这样做生多可怕的性能问题。

假设您实在想拿返回的数额行打乱了,你闹N种方法好高达这目的。这样使就给你的数据库的性质上指数级的降低。这里的问题是:MySQL会不得
不失去执行RAND()函数(很耗CPU时间),而且就是为各国一样履行记录去记行,然后重新指向该排序。就终于你用了Limit
1也行不通(因为要是排序)

脚的言传身教是擅自挑一样长达记下

葡京在线开户 553

 

 

  7. 避免 SELECT *

从今数据库里读来更加多的数目,那么查询就会见变换得越慢。并且,如果你的数据库服务器和WEB服务器是片大独立的服务器来说,这还会见追加网络传输的负荷。

故而,你当养成一个用什么就获取什么的好的习惯。

葡京在线开户 554

 

 

  8. 世代为各级张表设置一个ID

俺们应为数据库里的诸张表都装一个ID做为其主键,而且太好的凡一个INT型的(推荐使用UNSIGNED),并安装及机关增加的AUTO_INCREMENT标志。

纵然是若 users 表有一个主键叫 “email”的字段,你也转移给其成主键。使用
VARCHAR
类型来当主键会下得性能降低。另外,在您的顺序中,你该使用表的ID来布局你的数据结构。

与此同时,在MySQL数据引擎下,还有有操作需要动用主键,在这些情况下,主键的性能与安变得不可开交重要,比如,集群,分区……

每当此,只发一个状态是不同,那即便是“关联表”的“外键”,也就是说,这个发明的主键,通过多个别的表明底主键构成。我们将这情称“外键”。比
如:有一个“学生表”有学童的ID,有一个“课程表”有学科ID,那么,“成绩表”就是“关联表”了,其干了学生表和课程表,在实绩表中,学生ID和课
程ID给“外键”其共同构成主键。

  9. 使用 ENUM 而不是 VARCHAR

ENUM 类型是深抢和紧的。在实际上,其保存之是
TINYINT,但那个外部上显得为字符串。这样一来,用者字段来做一些挑选列表变得相当的健全。

只要您产生一个字段,比如“性别”,“国家”,“民族”,“状态”或“部门”,你懂这些字段的取值是有限而一定的,那么,你应当使用
ENUM 而非是 VARCHAR。

MySQL也闹一个“建议”(见第十长)告诉你怎么去又组织而的申结构。当你生出一个
VARCHAR 字段时,这个建议会告诉您拿那个反成为 ENUM 类型。使用 PROCEDURE
ANALYSE() 你可得到有关的建议。

  10. 从 PROCEDURE ANALYSE() 取得建议

PROCEDURE ANALYSE() 会给 MySQL
帮你错过分析你的字段和其实际的数量,并会叫您有的中之建议。只有表中起实际的数码,这些建议才见面变得生因此,因为只要召开一些怪之主宰是需要出数量作为基础之。

譬如,如果您创造了一个 INT
字段作为你的主键,然而并没尽多之多少,那么,PROCEDURE
ANALYSE()会建议乃管此字段的种变更化 MEDIUMINT 。或是你下了一个
VARCHAR 字段,因为数量不多,你恐怕会见获取一个为你管其改变成为 ENUM
的提议。这些建议,都是可能为数量不够多,所以决定做得就非敷准。

在phpmyadmin里,你可以查阅表时,点击 “Propose table structure”
来查阅这些建议

葡京在线开户 555

 

 

肯定要留心,这些只是是建议,只有当你的表里的多少更是多时,这些建议才见面更换得可靠。一定要铭记,你才是终极开决定的人数。

  11. 不择手段的采取 NOT NULL

惟有您生出一个死特别的故去动 NULL 值,你应有总是给你的字段保持 NOT
NULL。这看起好像有些争议,请于下看。

先是,问问您自己“Empty”和“NULL”有多万分之分(如果是INT,那就是0及NULL)?如果你当它们之间从来不呀区别,那么你就算不用使用NULL。(你懂得呢?在
Oracle 里,NULL 和 Empty 的字符串是同样的!)

毫无认为 NULL
不欲空间,其需要格外的上空,并且,在您进行较的下,你的程序会再也扑朔迷离。
当然,这里连无是说你就未可知使用NULL了,现实情况是特别复杂的,依然会稍为情况下,你得用NULL值。

 

  12. Prepared Statements

Prepared
Statements很像存储过程,是同样种运行于后台的SQL语句集合,我们好从使用
prepared statements 获得过多利,无论是性能问题要安全题材。

Prepared Statements
可以检查有你绑定好的变量,这样好保障而的次不见面遭遇“SQL注入式”攻击。当然,你啊得手动地检讨你的这些变量,然而,手动的检查好出问题,
而且很经常会面给程序员忘了。当我们应用有framework或是ORM的时节,这样的问题会见好一些。

在性方面,当一个一律的查询被用频繁的上,这会呢您带莫大的特性优势。你可吃这些Prepared
Statements定义有参数,而MySQL只见面分析一浅。

虽然新颖版本的MySQL在传Prepared
Statements是用二进制形势,所以就会令网络传输非常有效率。

本来,也生一些景象下,我们得避免采取Prepared
Statements,因为那个未支持查询缓存。但据说版本5.1后支持了。

于PHP中使动用prepared statements,你得查阅其使用手册:mysqli 扩展
或是使用数据库抽象层,如: PDO.

葡京在线开户 556

 

 

  13. 管缓冲的查询

常规的场面下,当你当当你当公的本子中履行一个SQL语句的时节,你的主次会停在那里直到没这SQL语句返回,然后你的次第还于下继续执行。你可行使无缓冲查询来改变这行为。

 

mysql_unbuffered_query()
发送一个SQL语句到MySQL而并无像mysql_query()一样去自动fethch和缓存结果。这会一定节约很多冲天之内存,尤其是那些会时有发生大
量结果的查询语句,并且,你莫需等到有的结果尚且回,只待首先行数据返回的时候,你不怕可以起来就开工作吃查询结果了。

然,这会来部分克。因为您还是将具备行都读走,或是你一旦当进展下同样糟糕的询问前调用
mysql_free_result() 清除结果。而且, mysql_num_rows() 或
mysql_data_seek()
将无法采取。所以,是否使用无缓冲的询问而用细致考虑。

  14. 将IP地址存成 UNSIGNED INT

不少程序员都见面创一个 VARCHAR(15)
字段来存放字符串形式之IP而休是整形的IP。如果你用整形来存放在,只待4独字节,并且你可以出定长的字段。而且,这会呢而带查询及的优势,尤其是当
你需要利用这样的WHERE条件:IP between ip1 and ip2。

咱们一定需要动用UNSIGNED INT,因为 IP地址会采取所有32号之无符号整形。

一旦若的询问,你可以采用 INET_ATON() 来将一个字符串IP转成一个整形,并运用
INET_NTOA() 把一个整形转成为一个字符串IP。在PHP中,也来诸如此类的函数
ip2long() 和 long2ip()。

葡京在线开户 557

 

 

  15. 稳住长度的表会更快

要是表中的装有字段都是“固定长度”的,整个表会被认为是 “static” 或
“fixed-length”。 例如,表中从来不如下类型的字段:
VARCHAR,TEXT,BLOB。只要您连了中间一个这些字段,那么这发明就无是“固定长度静态表”了,这样,MySQL
引擎会因此另外一样种办法来处理。

稳定长度的表会提高性,因为MySQL搜寻得会再次快有,因为这些定位的长短是坏轻计算下一个数量的偏移量的,所以读取的自吧会生快。而设字段非是定长的,那么,每一样不善如摸下同样长达的言语,需要程序找到主键。

而,固定长度的阐发也又易受缓存和重建。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用无用,他都是使分配那么多的半空中。

利用“垂直细分”技术(见下一样漫长),你可分而的表明变为简单个一个凡是定长的,一个尽管是免自然长的。

  16. 垂直细分

“垂直细分”是一模一样栽将数据库中之表明按列成几张表的法子,这样好降低表的复杂度和字段的数据,从而达到优化的目的。(以前,在银行做了项目,见了一样布置表出100大抵个字段,很恐怖)

演示一:在Users表中生出一个字段是门地址,这个字段是不过卜字段,相比起,而且若以数据库操作的时候除了个人信息外,你并不需要经常读取或是改
写这字段。那么,为什么未把他置另外一张表中吗?
这样见面被你的表有更好之性,大家想想是勿是,大量的时,我对此用户表来说,只有用户ID,用户称,口令,用户角色当会于常使用。小一些之表总是会生出
好之性。

演示二: 你产生一个被 “last_login”
的字段,它见面于历次用户登录时于更新。但是,每次换代时见面促成该表的询问缓存被清空。所以,你可把此字段放到任何一个表中,这样即便非会见潜移默化你针对用户
ID,用户称,用户角色的不鸣金收兵地朗诵博了,因为查询缓存会帮你增加很多性质。

此外,你得注意的凡,这些吃剪切出去的字段所形成的阐明,你不见面经常性地去Join他们,不然的话,这样的习性会比不分割时还要差,而且,会是太数级的落。

  17. 拆分大之 DELETE 或 INSERT 语句

如果你待以一个在线的网站上执行一个死的 DELETE 或 INSERT
查询,你要很小心,要避你的操作让你的通网站已相应。因为就简单单操作是碰头锁表的,表一锁住了,别的操作都向前无来了。

Apache
会有众多之子进程或线程。所以,其工作起来相当有效率,而我辈的服务器也不希望有极多之子进程,线程和数据库链接,这是宏大的占用服务器资源的事务,尤其是内存。

倘你管您的表锁上一段时间,比如30秒钟,那么对于一个出深高访问量的站点来说,这30秒所累的拜会过程/线程,数据库链接,打开的公文反复,可能不仅仅会吃你泊WEB服务Crash,还可能会见于您的整台服务器就掛了。

故而,如果你生出一个死之处理,你必你得把其拆分,使用 LIMIT
条件是一个好之措施。下面是一个示范:

葡京在线开户 558

 

 

  18. 更为聊之列会越快

对此绝大多数之数据库引擎来说,硬盘操作可能是绝根本的瓶颈。所以,把你的数目易得紧凑会对这种状态非常有帮,因为马上减少了针对硬盘的访。

参照 MySQL 的文档 Storage Requirements 查看所有的数据类型。

一旦一个表只会发出几乎列罢了(比如说字典表,配置表),那么,我们不怕从不理由使用
INT 来开主键,使用 MEDIUMINT, SMALLINT 或是更小的 TINYINT
会更划算部分。如果你无待记录时间,使用 DATE 要于 DATETIME 好得几近。

当,你也要留够足够的扩展空间,不然,你之后来波及这从,你会大的很难看,参看Slashdot的事例(2009年11月06日),一个简易的ALTER
TABLE语句花了3单多时,因为中间来一千六百万长条数。

  19. 甄选对的囤引擎

在 MySQL 中生出少独存储引擎 MyISAM 和
InnoDB,每个引擎都有利有弊。酷壳以前文章《MySQL: InnoDB 还是
MyISAM?》讨论和这工作。

MyISAM
副吃有亟需大量查询的采取,但其于有雅量描写操作并无是坏好。甚至你只是是待update一个字段,整个表都会被钉起来,而别的进程,就到底读进程都
无法操作直到读操作完。另外,MyISAM 对于 SELECT COUNT(*)
这仿佛的计是超快无比之。

InnoDB 的方向会是一个非常复杂的贮存引擎,对于有些聊的下,它见面于 MyISAM
还慢。他是它们支持“行锁”
,于是以描写操作比较多之时段,会又美妙。并且,他还支持更多之高级应用,比如:事务。

下面是MySQL的手册

target=”_blank”MyISAM Storage Engine

InnoDB Storage Engine

  20. 运一个目标关系映射器(Object Relational Mapper)

运 ORM (Object Relational
Mapper),你能够获取保险的性能增涨。一个ORM可以做的有所事务,也会为手动的编排出来。但是,这亟需一个高等专家。

ORM 的无比重大之凡“Lazy
Loading”,也就是说,只有在急需之失去取值的时光才会去真正的失做。但你啊需要小心这种体制的副作用,因为这挺有或会见因要是去创造很多浩大不怎么之询问反而会降低性能。

ORM 还得管你的SQL语句打包改成一个事情,这会比较单独实施他们赶紧得差不多得几近。

此时此刻,个人极端欣赏的PHP的ORM是:Doctrine。

  21. 小心“永久链接”

“永久链接”的目的是故来减少重复创设MySQL链接的次数。当一个链接给创造了,它会永远处于连接的状态,就终于数据库操作就终止了。而且,自
从我们的Apache开始选定它的子进程后——也就是说,下同样不良的HTTP请求会用Apache的子进程,并引用相同的
MySQL 链接。

PHP手册:mysql_pconnect()

当争鸣及的话,这任起十分之没错。但是由个体经验(也是大多数丁之)上来说,这个作用做出来的末节更多。因为,你才来个别的链接数,内存问题,文件句柄数,等等。

再者,Apache
运行于最为并行的环境受到,会创很多浩大底了经过。这便是干什么这种“永久链接”的编制工作地不好的由来。在公说了算使动“永久链接”之前,你要好好地考虑一下你的上上下下体系的架构。

 

补充:

mysql强制索引和取缔某个索引

1、mysql强制行使索引:force index(索引名或者主键PRI)

例如:

select * from table force index(PRI) limit 2;(强制行使主键)

select * from table force index(ziduan1_index) limit
2;(强制行使索引”ziduan1_index”)

select * from table force index(PRI,ziduan1_index) limit
2;(强制行使索引”PRI和ziduan1_index”)

 

2、mysql禁止某个索引:ignore index(索引名或者主键PRI)

例如:

select * from table ignore index(PRI) limit 2;(禁止用主键)

select * from table ignore index(ziduan1_index) limit
2;(禁止采取索引”ziduan1_index”)

select * from table ignore index(PRI,ziduan1_index) limit
2;(禁止行使索引”PRI,ziduan1_index”)

您对人生迷茫吗? 那便背着起行囊,起步远行吧